Clang Project

clang_source_code/include/clang/Driver/Distro.h
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
14namespace clang {
15namespace driver {
16
17/// Distro - Helper class for detecting and classifying Linux distributions.
18///
19/// This class encapsulates the clang Linux distribution detection mechanism
20/// as well as helper functions that match the specific (versioned) results
21/// into wider distribution classes.
22class Distro {
23public:
24  enum DistroType {
25    // NB: Releases of a particular Linux distro should be kept together
26    // in this enum, because some tests are done by integer comparison against
27    // the first and last known member in the family, e.g. IsRedHat().
28    AlpineLinux,
29    ArchLinux,
30    DebianLenny,
31    DebianSqueeze,
32    DebianWheezy,
33    DebianJessie,
34    DebianStretch,
35    DebianBuster,
36    Exherbo,
37    RHEL5,
38    RHEL6,
39    RHEL7,
40    Fedora,
41    Gentoo,
42    OpenSUSE,
43    UbuntuHardy,
44    UbuntuIntrepid,
45    UbuntuJaunty,
46    UbuntuKarmic,
47    UbuntuLucid,
48    UbuntuMaverick,
49    UbuntuNatty,
50    UbuntuOneiric,
51    UbuntuPrecise,
52    UbuntuQuantal,
53    UbuntuRaring,
54    UbuntuSaucy,
55    UbuntuTrusty,
56    UbuntuUtopic,
57    UbuntuVivid,
58    UbuntuWily,
59    UbuntuXenial,
60    UbuntuYakkety,
61    UbuntuZesty,
62    UbuntuArtful,
63    UbuntuBionic,
64    UbuntuCosmic,
65    UbuntuDisco,
66    UnknownDistro
67  };
68
69private:
70  /// The distribution, possibly with specific version.
71  DistroType DistroVal;
72
73public:
74  /// @name Constructors
75  /// @{
76
77  /// Default constructor leaves the distribution unknown.
78  Distro() : DistroVal() {}
79
80  /// Constructs a Distro type for specific distribution.
81  Distro(DistroType D) : DistroVal(D) {}
82
83  /// Detects the distribution using specified VFS.
84  explicit Distro(llvm::vfs::FileSystem &VFS);
85
86  bool operator==(const Distro &Otherconst {
87    return DistroVal == Other.DistroVal;
88  }
89
90  bool operator!=(const Distro &Otherconst {
91    return DistroVal != Other.DistroVal;
92  }
93
94  bool operator>=(const Distro &Otherconst {
95    return DistroVal >= Other.DistroVal;
96  }
97
98  bool operator<=(const Distro &Otherconst {
99    return DistroVal <= Other.DistroVal;
100  }
101
102  /// @}
103  /// @name Convenience Predicates
104  /// @{
105
106  bool IsRedhat() const {
107    return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7);
108  }
109
110  bool IsOpenSUSE() const {
111    return DistroVal == OpenSUSE;
112  }
113
114  bool IsDebian() const {
115    return DistroVal >= DebianLenny && DistroVal <= DebianBuster;
116  }
117
118  bool IsUbuntu() const {
119    return DistroVal >= UbuntuHardy && DistroVal <= UbuntuDisco;
120  }
121
122  bool IsAlpineLinux() const {
123    return DistroVal == AlpineLinux;
124  }
125
126  bool IsGentoo() const {
127    return DistroVal == Gentoo;
128  }
129
130  /// @}
131};
132
133// end namespace driver
134// end namespace clang
135
136#endif
137
clang::driver::Distro::DistroType
clang::driver::Distro::DistroVal
clang::driver::Distro::IsRedhat
clang::driver::Distro::IsOpenSUSE
clang::driver::Distro::IsDebian
clang::driver::Distro::IsUbuntu
clang::driver::Distro::IsAlpineLinux
clang::driver::Distro::IsGentoo