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