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
15namespace clang {
16namespace 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.
23class Distro {
24public:
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
85private:
86 /// The distribution, possibly with specific version.
87 DistroType DistroVal;
88
89public:
90 /// @name Constructors
91 /// @{
92
93 /// Default constructor leaves the distribution unknown.
94 Distro() : DistroVal() {}
95
96 /// Constructs a Distro type for specific distribution.
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
122 bool IsRedhat() const {
123 return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7);
124 }
125
126 bool IsOpenSUSE() const { return DistroVal == OpenSUSE; }
127
128 bool IsDebian() const {
129 return DistroVal >= DebianLenny && DistroVal <= DebianTrixie;
130 }
131
132 bool IsUbuntu() const {
133 return DistroVal >= UbuntuHardy && DistroVal <= UbuntuNoble;
134 }
135
136 bool IsAlpineLinux() const { return DistroVal == AlpineLinux; }
137
138 bool IsGentoo() const { return DistroVal == Gentoo; }
139
140 /// @}
141};
142
143} // end namespace driver
144} // end namespace clang
145
146#endif
147

source code of clang/include/clang/Driver/Distro.h