Index: include/clang/Driver/Distro.h =================================================================== --- include/clang/Driver/Distro.h +++ include/clang/Driver/Distro.h @@ -28,6 +28,7 @@ // the first and last known member in the family, e.g. IsRedHat(). AlpineLinux, ArchLinux, + ClearLinux, DebianLenny, DebianSqueeze, DebianWheezy, @@ -122,6 +123,10 @@ return DistroVal == AlpineLinux; } + bool IsClearLinux() const { + return DistroVal == ClearLinux; + } + /// @} }; Index: lib/Driver/Distro.cpp =================================================================== --- lib/Driver/Distro.cpp +++ lib/Driver/Distro.cpp @@ -137,6 +137,21 @@ if (VFS.exists("/etc/arch-release")) return Distro::ArchLinux; + File = VFS.getBufferForFile("/etc/os-release"); + if (!File) + File = VFS.getBufferForFile("/usr/lib/os-release"); + if (File) { + StringRef Data = File.get()->getBuffer(); + SmallVector Lines; + Data.split(Lines, "\n"); + Distro::DistroType Version = Distro::UnknownDistro; + for (StringRef Line : Lines) + if (Version == Distro::UnknownDistro && Line.startswith("ID_LIKE=")) + Version = llvm::StringSwitch(Line.substr(7)) + .Case("clear-linux-os", Distro::ClearLinux); + return Version; + } + return Distro::UnknownDistro; } Index: lib/Driver/ToolChains/Linux.cpp =================================================================== --- lib/Driver/ToolChains/Linux.cpp +++ lib/Driver/ToolChains/Linux.cpp @@ -229,17 +229,20 @@ Distro Distro(D.getVFS()); - if (Distro.IsAlpineLinux() || Triple.isAndroid()) { + if (Distro.IsAlpineLinux() || Distro.IsClearLinux() || Triple.isAndroid()) { ExtraOpts.push_back("-z"); ExtraOpts.push_back("now"); } if (Distro.IsOpenSUSE() || Distro.IsUbuntu() || Distro.IsAlpineLinux() || - Triple.isAndroid()) { + Distro.IsClearLinux() || Triple.isAndroid()) { ExtraOpts.push_back("-z"); ExtraOpts.push_back("relro"); } + if (Distro.IsClearLinux()) + ExtraOpts.push_back("--copy-dt-needed-entries"); + if (GCCInstallation.getParentLibPath().find("opt/rh/devtoolset") != StringRef::npos) // With devtoolset on RHEL, we want to add a bin directory that is relative @@ -287,7 +290,7 @@ ExtraOpts.push_back("--build-id"); #endif - if (IsAndroid || Distro.IsOpenSUSE()) + if (IsAndroid || Distro.IsOpenSUSE() || Distro.IsClearLinux()) ExtraOpts.push_back("--enable-new-dtags"); // The selection of paths to try here is designed to match the patterns which Index: unittests/Driver/DistroTest.cpp =================================================================== --- unittests/Driver/DistroTest.cpp +++ unittests/Driver/DistroTest.cpp @@ -302,4 +302,28 @@ ASSERT_FALSE(ArchLinux.IsDebian()); } +TEST(DistroTest, DetectClearLinux) { + vfs::InMemoryFileSystem ClearLinuxFileSystem; + ClearLinuxFileSystem.addFile("/usr/lib/os-release", 0, + llvm::MemoryBuffer::getMemBuffer("NAME=\"Clear Linux OS\"\n" + "VERSION=1\n" + "ID=clear-linux-os\n" + "ID_LIKE=clear-linux-os\n" + "VERSION_ID=25530\n" + "PRETTY_NAME=\"Clear Linux OS\"\n" + "ANSI_COLOR=\"1;35\"\n" + "HOME_URL=\"https://clearlinux.org\"\n" + "SUPPORT_URL=\"https://clearlinux.org\"\n" + "BUG_REPORT_URL=\"mailto:dev@lists.clearlinux.org\"\n" + "PRIVACY_POLICY_URL=\"http://www.intel.com/privacy\"\n")); + + Distro ClearLinux{ClearLinuxFileSystem}; + ASSERT_EQ(Distro(Distro::ClearLinux), ClearLinux); + ASSERT_TRUE(ClearLinux.IsClearLinux()); + ASSERT_FALSE(ClearLinux.IsUbuntu()); + ASSERT_FALSE(ClearLinux.IsRedhat()); + ASSERT_FALSE(ClearLinux.IsOpenSUSE()); + ASSERT_FALSE(ClearLinux.IsDebian()); +} + } // end anonymous namespace