Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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. |
||
92 | Distro() : DistroVal() {} |
||
93 | |||
94 | /// Constructs a Distro type for specific distribution. |
||
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 | |||
120 | bool IsRedhat() const { |
||
121 | return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7); |
||
122 | } |
||
123 | |||
124 | bool IsOpenSUSE() const { return DistroVal == OpenSUSE; } |
||
125 | |||
126 | bool IsDebian() const { |
||
127 | return DistroVal >= DebianLenny && DistroVal <= DebianTrixie; |
||
128 | } |
||
129 | |||
130 | bool IsUbuntu() const { |
||
131 | return DistroVal >= UbuntuHardy && DistroVal <= UbuntuLunar; |
||
132 | } |
||
133 | |||
134 | bool IsAlpineLinux() const { return DistroVal == AlpineLinux; } |
||
135 | |||
136 | bool IsGentoo() const { return DistroVal == Gentoo; } |
||
137 | |||
138 | /// @} |
||
139 | }; |
||
140 | |||
141 | } // end namespace driver |
||
142 | } // end namespace clang |
||
143 | |||
144 | #endif |