1e5dd7070Spatrick //===--- Distro.h - Linux distribution detection support --------*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick 
9e5dd7070Spatrick #ifndef LLVM_CLANG_DRIVER_DISTRO_H
10e5dd7070Spatrick #define LLVM_CLANG_DRIVER_DISTRO_H
11e5dd7070Spatrick 
12e5dd7070Spatrick #include "llvm/ADT/Triple.h"
13e5dd7070Spatrick #include "llvm/Support/VirtualFileSystem.h"
14e5dd7070Spatrick 
15e5dd7070Spatrick namespace clang {
16e5dd7070Spatrick namespace driver {
17e5dd7070Spatrick 
18e5dd7070Spatrick /// Distro - Helper class for detecting and classifying Linux distributions.
19e5dd7070Spatrick ///
20e5dd7070Spatrick /// This class encapsulates the clang Linux distribution detection mechanism
21e5dd7070Spatrick /// as well as helper functions that match the specific (versioned) results
22e5dd7070Spatrick /// into wider distribution classes.
23e5dd7070Spatrick class Distro {
24e5dd7070Spatrick public:
25e5dd7070Spatrick   enum DistroType {
26a9ac8606Spatrick     // Special value means that no detection was performed yet.
27a9ac8606Spatrick     UninitializedDistro,
28e5dd7070Spatrick     // NB: Releases of a particular Linux distro should be kept together
29e5dd7070Spatrick     // in this enum, because some tests are done by integer comparison against
30e5dd7070Spatrick     // the first and last known member in the family, e.g. IsRedHat().
31e5dd7070Spatrick     AlpineLinux,
32e5dd7070Spatrick     ArchLinux,
33e5dd7070Spatrick     DebianLenny,
34e5dd7070Spatrick     DebianSqueeze,
35e5dd7070Spatrick     DebianWheezy,
36e5dd7070Spatrick     DebianJessie,
37e5dd7070Spatrick     DebianStretch,
38e5dd7070Spatrick     DebianBuster,
39e5dd7070Spatrick     DebianBullseye,
40*12c85518Srobert     DebianBookworm,
41*12c85518Srobert     DebianTrixie,
42e5dd7070Spatrick     Exherbo,
43e5dd7070Spatrick     RHEL5,
44e5dd7070Spatrick     RHEL6,
45e5dd7070Spatrick     RHEL7,
46e5dd7070Spatrick     Fedora,
47e5dd7070Spatrick     Gentoo,
48e5dd7070Spatrick     OpenSUSE,
49e5dd7070Spatrick     UbuntuHardy,
50e5dd7070Spatrick     UbuntuIntrepid,
51e5dd7070Spatrick     UbuntuJaunty,
52e5dd7070Spatrick     UbuntuKarmic,
53e5dd7070Spatrick     UbuntuLucid,
54e5dd7070Spatrick     UbuntuMaverick,
55e5dd7070Spatrick     UbuntuNatty,
56e5dd7070Spatrick     UbuntuOneiric,
57e5dd7070Spatrick     UbuntuPrecise,
58e5dd7070Spatrick     UbuntuQuantal,
59e5dd7070Spatrick     UbuntuRaring,
60e5dd7070Spatrick     UbuntuSaucy,
61e5dd7070Spatrick     UbuntuTrusty,
62e5dd7070Spatrick     UbuntuUtopic,
63e5dd7070Spatrick     UbuntuVivid,
64e5dd7070Spatrick     UbuntuWily,
65e5dd7070Spatrick     UbuntuXenial,
66e5dd7070Spatrick     UbuntuYakkety,
67e5dd7070Spatrick     UbuntuZesty,
68e5dd7070Spatrick     UbuntuArtful,
69e5dd7070Spatrick     UbuntuBionic,
70e5dd7070Spatrick     UbuntuCosmic,
71e5dd7070Spatrick     UbuntuDisco,
72e5dd7070Spatrick     UbuntuEoan,
73e5dd7070Spatrick     UbuntuFocal,
74ec727ea7Spatrick     UbuntuGroovy,
75a9ac8606Spatrick     UbuntuHirsute,
76a9ac8606Spatrick     UbuntuImpish,
77*12c85518Srobert     UbuntuJammy,
78*12c85518Srobert     UbuntuKinetic,
79*12c85518Srobert     UbuntuLunar,
80e5dd7070Spatrick     UnknownDistro
81e5dd7070Spatrick   };
82e5dd7070Spatrick 
83e5dd7070Spatrick private:
84e5dd7070Spatrick   /// The distribution, possibly with specific version.
85e5dd7070Spatrick   DistroType DistroVal;
86e5dd7070Spatrick 
87e5dd7070Spatrick public:
88e5dd7070Spatrick   /// @name Constructors
89e5dd7070Spatrick   /// @{
90e5dd7070Spatrick 
91e5dd7070Spatrick   /// Default constructor leaves the distribution unknown.
Distro()92e5dd7070Spatrick   Distro() : DistroVal() {}
93e5dd7070Spatrick 
94e5dd7070Spatrick   /// Constructs a Distro type for specific distribution.
Distro(DistroType D)95e5dd7070Spatrick   Distro(DistroType D) : DistroVal(D) {}
96e5dd7070Spatrick 
97e5dd7070Spatrick   /// Detects the distribution using specified VFS.
98e5dd7070Spatrick   explicit Distro(llvm::vfs::FileSystem &VFS, const llvm::Triple &TargetOrHost);
99e5dd7070Spatrick 
100e5dd7070Spatrick   bool operator==(const Distro &Other) const {
101e5dd7070Spatrick     return DistroVal == Other.DistroVal;
102e5dd7070Spatrick   }
103e5dd7070Spatrick 
104e5dd7070Spatrick   bool operator!=(const Distro &Other) const {
105e5dd7070Spatrick     return DistroVal != Other.DistroVal;
106e5dd7070Spatrick   }
107e5dd7070Spatrick 
108e5dd7070Spatrick   bool operator>=(const Distro &Other) const {
109e5dd7070Spatrick     return DistroVal >= Other.DistroVal;
110e5dd7070Spatrick   }
111e5dd7070Spatrick 
112e5dd7070Spatrick   bool operator<=(const Distro &Other) const {
113e5dd7070Spatrick     return DistroVal <= Other.DistroVal;
114e5dd7070Spatrick   }
115e5dd7070Spatrick 
116e5dd7070Spatrick   /// @}
117e5dd7070Spatrick   /// @name Convenience Predicates
118e5dd7070Spatrick   /// @{
119e5dd7070Spatrick 
IsRedhat()120e5dd7070Spatrick   bool IsRedhat() const {
121e5dd7070Spatrick     return DistroVal == Fedora || (DistroVal >= RHEL5 && DistroVal <= RHEL7);
122e5dd7070Spatrick   }
123e5dd7070Spatrick 
IsOpenSUSE()124a9ac8606Spatrick   bool IsOpenSUSE() const { return DistroVal == OpenSUSE; }
125e5dd7070Spatrick 
IsDebian()126e5dd7070Spatrick   bool IsDebian() const {
127*12c85518Srobert     return DistroVal >= DebianLenny && DistroVal <= DebianTrixie;
128e5dd7070Spatrick   }
129e5dd7070Spatrick 
IsUbuntu()130e5dd7070Spatrick   bool IsUbuntu() const {
131*12c85518Srobert     return DistroVal >= UbuntuHardy && DistroVal <= UbuntuLunar;
132e5dd7070Spatrick   }
133e5dd7070Spatrick 
IsAlpineLinux()134a9ac8606Spatrick   bool IsAlpineLinux() const { return DistroVal == AlpineLinux; }
135e5dd7070Spatrick 
IsGentoo()136a9ac8606Spatrick   bool IsGentoo() const { return DistroVal == Gentoo; }
137e5dd7070Spatrick 
138e5dd7070Spatrick   /// @}
139e5dd7070Spatrick };
140e5dd7070Spatrick 
141e5dd7070Spatrick } // end namespace driver
142e5dd7070Spatrick } // end namespace clang
143e5dd7070Spatrick 
144e5dd7070Spatrick #endif
145