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. |
94 | Distro() : DistroVal() {} |
95 | |
96 | /// Constructs a Distro type for specific distribution. |
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 | |
122 | bool IsRedhat() const { |
123 | return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7); |
124 | } |
125 | |
126 | bool IsOpenSUSE() const { return DistroVal == OpenSUSE; } |
127 | |
128 | bool IsDebian() const { |
129 | return DistroVal >= DebianLenny && DistroVal <= DebianTrixie; |
130 | } |
131 | |
132 | bool IsUbuntu() const { |
133 | return DistroVal >= UbuntuHardy && DistroVal <= UbuntuNoble; |
134 | } |
135 | |
136 | bool IsAlpineLinux() const { return DistroVal == AlpineLinux; } |
137 | |
138 | bool IsGentoo() const { return DistroVal == Gentoo; } |
139 | |
140 | /// @} |
141 | }; |
142 | |
143 | } // end namespace driver |
144 | } // end namespace clang |
145 | |
146 | #endif |
147 | |