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 UnknownDistro 83 }; 84 85 private: 86 /// The distribution, possibly with specific version. 87 DistroType DistroVal; 88 89 public: 90 /// @name Constructors 91 /// @{ 92 93 /// Default constructor leaves the distribution unknown. Distro()94 Distro() : DistroVal() {} 95 96 /// Constructs a Distro type for specific distribution. Distro(DistroType D)97 Distro(DistroType D) : DistroVal(D) {} 98 99 /// Detects the distribution using specified VFS. 100 explicit Distro(llvm::vfs::FileSystem &VFS, const llvm::Triple &TargetOrHost); 101 102 bool operator==(const Distro &Other) const { 103 return DistroVal == Other.DistroVal; 104 } 105 106 bool operator!=(const Distro &Other) const { 107 return DistroVal != Other.DistroVal; 108 } 109 110 bool operator>=(const Distro &Other) const { 111 return DistroVal >= Other.DistroVal; 112 } 113 114 bool operator<=(const Distro &Other) const { 115 return DistroVal <= Other.DistroVal; 116 } 117 118 /// @} 119 /// @name Convenience Predicates 120 /// @{ 121 IsRedhat()122 bool IsRedhat() const { 123 return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7); 124 } 125 IsOpenSUSE()126 bool IsOpenSUSE() const { return DistroVal == OpenSUSE; } 127 IsDebian()128 bool IsDebian() const { 129 return DistroVal >= DebianLenny && DistroVal <= DebianTrixie; 130 } 131 IsUbuntu()132 bool IsUbuntu() const { 133 return DistroVal >= UbuntuHardy && DistroVal <= UbuntuNoble; 134 } 135 IsAlpineLinux()136 bool IsAlpineLinux() const { return DistroVal == AlpineLinux; } 137 IsGentoo()138 bool IsGentoo() const { return DistroVal == Gentoo; } 139 140 /// @} 141 }; 142 143 } // end namespace driver 144 } // end namespace clang 145 146 #endif 147