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