clang  14.0.0git
Distro.h
Go to the documentation of this file.
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/ADT/Triple.h"
13 #include "llvm/Support/VirtualFileSystem.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.
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().
77  };
78 
79 private:
80  /// The distribution, possibly with specific version.
81  DistroType DistroVal;
82 
83 public:
84  /// @name Constructors
85  /// @{
86 
87  /// Default constructor leaves the distribution unknown.
88  Distro() : DistroVal() {}
89 
90  /// Constructs a Distro type for specific distribution.
91  Distro(DistroType D) : DistroVal(D) {}
92 
93  /// Detects the distribution using specified VFS.
94  explicit Distro(llvm::vfs::FileSystem &VFS, const llvm::Triple &TargetOrHost);
95 
96  bool operator==(const Distro &Other) const {
97  return DistroVal == Other.DistroVal;
98  }
99 
100  bool operator!=(const Distro &Other) const {
101  return DistroVal != Other.DistroVal;
102  }
103 
104  bool operator>=(const Distro &Other) const {
105  return DistroVal >= Other.DistroVal;
106  }
107 
108  bool operator<=(const Distro &Other) const {
109  return DistroVal <= Other.DistroVal;
110  }
111 
112  /// @}
113  /// @name Convenience Predicates
114  /// @{
115 
116  bool IsRedhat() const {
117  return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7);
118  }
119 
120  bool IsOpenSUSE() const { return DistroVal == OpenSUSE; }
121 
122  bool IsDebian() const {
123  return DistroVal >= DebianLenny && DistroVal <= DebianBookworm;
124  }
125 
126  bool IsUbuntu() const {
127  return DistroVal >= UbuntuHardy && DistroVal <= UbuntuImpish;
128  }
129 
130  bool IsAlpineLinux() const { return DistroVal == AlpineLinux; }
131 
132  bool IsGentoo() const { return DistroVal == Gentoo; }
133 
134  /// @}
135 };
136 
137 } // end namespace driver
138 } // end namespace clang
139 
140 #endif
clang::driver::Distro::IsUbuntu
bool IsUbuntu() const
Definition: Distro.h:126
clang::driver::Distro::DebianLenny
@ DebianLenny
Definition: Distro.h:33
clang::driver::Distro::RHEL7
@ RHEL7
Definition: Distro.h:44
clang::driver::Distro::DebianStretch
@ DebianStretch
Definition: Distro.h:37
clang::driver::Distro::UbuntuHirsute
@ UbuntuHirsute
Definition: Distro.h:74
clang::driver::Distro::UbuntuVivid
@ UbuntuVivid
Definition: Distro.h:62
clang::driver::Distro::UbuntuTrusty
@ UbuntuTrusty
Definition: Distro.h:60
clang::driver::Distro::IsDebian
bool IsDebian() const
Definition: Distro.h:122
clang::driver::Distro::ArchLinux
@ ArchLinux
Definition: Distro.h:32
clang::driver::Distro::RHEL5
@ RHEL5
Definition: Distro.h:42
clang::driver::Distro::DebianJessie
@ DebianJessie
Definition: Distro.h:36
clang::driver::Distro::RHEL6
@ RHEL6
Definition: Distro.h:43
clang::driver::Distro::UninitializedDistro
@ UninitializedDistro
Definition: Distro.h:27
clang::driver::Distro::IsOpenSUSE
bool IsOpenSUSE() const
Definition: Distro.h:120
clang::driver::Distro::UbuntuGroovy
@ UbuntuGroovy
Definition: Distro.h:73
clang::driver::Distro::UbuntuXenial
@ UbuntuXenial
Definition: Distro.h:64
clang::driver::Distro::UbuntuDisco
@ UbuntuDisco
Definition: Distro.h:70
clang::driver::Distro::DebianBuster
@ DebianBuster
Definition: Distro.h:38
clang::driver::Distro::UbuntuSaucy
@ UbuntuSaucy
Definition: Distro.h:59
clang::driver::Distro::IsGentoo
bool IsGentoo() const
Definition: Distro.h:132
clang::driver::Distro::UbuntuMaverick
@ UbuntuMaverick
Definition: Distro.h:53
clang::driver::Distro::UbuntuIntrepid
@ UbuntuIntrepid
Definition: Distro.h:49
clang::driver::Distro::DistroType
DistroType
Definition: Distro.h:25
clang::driver::Distro::UbuntuEoan
@ UbuntuEoan
Definition: Distro.h:71
clang::driver::Distro::Fedora
@ Fedora
Definition: Distro.h:45
clang::driver::Distro::operator==
bool operator==(const Distro &Other) const
Definition: Distro.h:96
clang::driver::Distro::operator!=
bool operator!=(const Distro &Other) const
Definition: Distro.h:100
clang::driver::Distro::UbuntuQuantal
@ UbuntuQuantal
Definition: Distro.h:57
clang::driver::Distro::DebianBookworm
@ DebianBookworm
Definition: Distro.h:40
clang::driver::Distro::IsRedhat
bool IsRedhat() const
Definition: Distro.h:116
clang::driver::Distro::DebianSqueeze
@ DebianSqueeze
Definition: Distro.h:34
clang::driver::Distro::UbuntuWily
@ UbuntuWily
Definition: Distro.h:63
clang::driver::Distro::UbuntuLucid
@ UbuntuLucid
Definition: Distro.h:52
clang::driver::Distro::DebianWheezy
@ DebianWheezy
Definition: Distro.h:35
clang::driver::Distro::Exherbo
@ Exherbo
Definition: Distro.h:41
clang::driver::Distro::UbuntuBionic
@ UbuntuBionic
Definition: Distro.h:68
clang::driver::Distro
Distro - Helper class for detecting and classifying Linux distributions.
Definition: Distro.h:23
clang::driver::Distro::UbuntuPrecise
@ UbuntuPrecise
Definition: Distro.h:56
clang::driver::Distro::UbuntuArtful
@ UbuntuArtful
Definition: Distro.h:67
clang::driver::Distro::UbuntuRaring
@ UbuntuRaring
Definition: Distro.h:58
clang::driver::Distro::UnknownDistro
@ UnknownDistro
Definition: Distro.h:76
clang::driver::Distro::UbuntuYakkety
@ UbuntuYakkety
Definition: Distro.h:65
clang
Definition: CalledOnceCheck.h:17
clang::driver::Distro::IsAlpineLinux
bool IsAlpineLinux() const
Definition: Distro.h:130
clang::driver::Distro::UbuntuZesty
@ UbuntuZesty
Definition: Distro.h:66
clang::driver::Distro::UbuntuImpish
@ UbuntuImpish
Definition: Distro.h:75
clang::driver::Distro::operator>=
bool operator>=(const Distro &Other) const
Definition: Distro.h:104
clang::driver::Distro::UbuntuNatty
@ UbuntuNatty
Definition: Distro.h:54
clang::driver::Distro::UbuntuUtopic
@ UbuntuUtopic
Definition: Distro.h:61
clang::driver::Distro::UbuntuHardy
@ UbuntuHardy
Definition: Distro.h:48
clang::driver::Distro::Distro
Distro()
Default constructor leaves the distribution unknown.
Definition: Distro.h:88
clang::driver::Distro::UbuntuFocal
@ UbuntuFocal
Definition: Distro.h:72
clang::driver::Distro::OpenSUSE
@ OpenSUSE
Definition: Distro.h:47
clang::driver::Distro::UbuntuCosmic
@ UbuntuCosmic
Definition: Distro.h:69
clang::driver::Distro::AlpineLinux
@ AlpineLinux
Definition: Distro.h:31
clang::driver::Distro::UbuntuOneiric
@ UbuntuOneiric
Definition: Distro.h:55
clang::driver::Distro::UbuntuKarmic
@ UbuntuKarmic
Definition: Distro.h:51
clang::driver::Distro::UbuntuJaunty
@ UbuntuJaunty
Definition: Distro.h:50
clang::driver::Distro::Distro
Distro(DistroType D)
Constructs a Distro type for specific distribution.
Definition: Distro.h:91
clang::driver::Distro::operator<=
bool operator<=(const Distro &Other) const
Definition: Distro.h:108
clang::driver::Distro::DebianBullseye
@ DebianBullseye
Definition: Distro.h:39
clang::driver::Distro::Gentoo
@ Gentoo
Definition: Distro.h:46