blob: 8291f6575a71146cc83889798b515775e5cd383d [file] [log] [blame]
Yi Kong83283012023-12-13 12:57:00 +09001//===--- 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 UnknownDistro
82 };
83
84private:
85 /// The distribution, possibly with specific version.
86 DistroType DistroVal;
87
88public:
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