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