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