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