1 //===--- Distro.h - Linux distribution detection support --------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_DRIVER_DISTRO_H 10 #define LLVM_CLANG_DRIVER_DISTRO_H 11 12 #include "llvm/Support/VirtualFileSystem.h" 13 #include "llvm/TargetParser/Triple.h" 14 15 namespace clang { 16 namespace driver { 17 18 /// Distro - Helper class for detecting and classifying Linux distributions. 19 /// 20 /// This class encapsulates the clang Linux distribution detection mechanism 21 /// as well as helper functions that match the specific (versioned) results 22 /// into wider distribution classes. 23 class Distro { 24 public: 25 enum DistroType { 26 // Special value means that no detection was performed yet. 27 UninitializedDistro, 28 // NB: Releases of a particular Linux distro should be kept together 29 // in this enum, because some tests are done by integer comparison against 30 // the first and last known member in the family, e.g. IsRedHat(). 31 AlpineLinux, 32 ArchLinux, 33 DebianLenny, 34 DebianSqueeze, 35 DebianWheezy, 36 DebianJessie, 37 DebianStretch, 38 DebianBuster, 39 DebianBullseye, 40 DebianBookworm, 41 DebianTrixie, 42 Exherbo, 43 RHEL5, 44 RHEL6, 45 RHEL7, 46 Fedora, 47 Gentoo, 48 OpenSUSE, 49 UbuntuHardy, 50 UbuntuIntrepid, 51 UbuntuJaunty, 52 UbuntuKarmic, 53 UbuntuLucid, 54 UbuntuMaverick, 55 UbuntuNatty, 56 UbuntuOneiric, 57 UbuntuPrecise, 58 UbuntuQuantal, 59 UbuntuRaring, 60 UbuntuSaucy, 61 UbuntuTrusty, 62 UbuntuUtopic, 63 UbuntuVivid, 64 UbuntuWily, 65 UbuntuXenial, 66 UbuntuYakkety, 67 UbuntuZesty, 68 UbuntuArtful, 69 UbuntuBionic, 70 UbuntuCosmic, 71 UbuntuDisco, 72 UbuntuEoan, 73 UbuntuFocal, 74 UbuntuGroovy, 75 UbuntuHirsute, 76 UbuntuImpish, 77 UbuntuJammy, 78 UbuntuKinetic, 79 UbuntuLunar, 80 UbuntuMantic, 81 UbuntuNoble, 82 UbuntuOracular, 83 UbuntuPlucky, 84 UnknownDistro 85 }; 86 87 private: 88 /// The distribution, possibly with specific version. 89 DistroType DistroVal; 90 91 public: 92 /// @name Constructors 93 /// @{ 94 95 /// Default constructor leaves the distribution unknown. 96 Distro() : DistroVal() {} 97 98 /// Constructs a Distro type for specific distribution. 99 Distro(DistroType D) : DistroVal(D) {} 100 101 /// Detects the distribution using specified VFS. 102 explicit Distro(llvm::vfs::FileSystem &VFS, const llvm::Triple &TargetOrHost); 103 104 bool operator==(const Distro &Other) const { 105 return DistroVal == Other.DistroVal; 106 } 107 108 bool operator!=(const Distro &Other) const { 109 return DistroVal != Other.DistroVal; 110 } 111 112 bool operator>=(const Distro &Other) const { 113 return DistroVal >= Other.DistroVal; 114 } 115 116 bool operator<=(const Distro &Other) const { 117 return DistroVal <= Other.DistroVal; 118 } 119 120 /// @} 121 /// @name Convenience Predicates 122 /// @{ 123 124 bool IsRedhat() const { 125 return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7); 126 } 127 128 bool IsOpenSUSE() const { return DistroVal == OpenSUSE; } 129 130 bool IsDebian() const { 131 return DistroVal >= DebianLenny && DistroVal <= DebianTrixie; 132 } 133 134 bool IsUbuntu() const { 135 return DistroVal >= UbuntuHardy && DistroVal <= UbuntuPlucky; 136 } 137 138 bool IsAlpineLinux() const { return DistroVal == AlpineLinux; } 139 140 bool IsGentoo() const { return DistroVal == Gentoo; } 141 142 /// @} 143 }; 144 145 } // end namespace driver 146 } // end namespace clang 147 148 #endif 149