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