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