# profiles/catalog.toml -- what a bentoo system can be composed from. # # Schema 2. Three consumers read this file; Portage ignores it: # * scripts/check-profile-matrix.sh validates it (--static) and applies the # composition rule (--compose) before every commit that touches profiles/; # * `bentoo profile` (app-portage/bentoolkit, Go) offers these presets and # layers to users and writes /etc/portage/make.profile/parent from them; # * `shidashi order` (Python) reads the same presets and layers. # All of them must agree, so any incompatible change bumps `schema` -- a # consumer refuses a schema it does not know rather than guessing. # # Schema 2 describes every preset on seven axes. Two of them are new: # * toolchain = "gcc" | "llvm" -- the compiler the ::gentoo profile builds # with. It replaces the former boolean `llvm` key, which no longer exists. # * libc = "glibc" | "musl" -- the C library. The glibc presets are the # default/linux/amd64/23.0 profiles; the musl presets are ::gentoo's amd64 # 23.0/musl profiles (merged-/usr only, never split-usr), every one of # them no-multilib and without a desktop. # # profiles/catalog-vectors.toml, which carries the same `schema`, holds the # composition rule as executable cases: a selection, then either the parent # lines it produces or the set of rules it breaks. check-profile-matrix.sh # and every other consumer run the same cases, so no implementation of the # rule can drift from the others. # # Binhost coverage is NOT catalog data. The official binhost serves # no-multilib x glibc x gcc x non-hardened x {openrc, systemd}; a consumer # learns what it covers from the binhost index, never from this file, so the # two can never disagree. # # A composition is one [[preset]] (a ::gentoo profile plus features/branding) # followed by at most one layer per exclusive type and any number of the # others. A layer is selectable only when its `base` holds for the preset's # attributes, it conflicts with no other selected layer (declared on both # sides) and everything it `requires` is selected. The parent lines are # ordered by type rank, then by the order the layers are declared here, so # declaration order is precedence: a later layer overrides an earlier one. # # Ids are paths relative to profiles/, so an id is also the `bentoo:` line # Portage reads. Preset entries mirror profiles/profiles.desc one to one, # status included. A layer that only works on some value of an axis says so # in its `base`; hardened, selinux and toolchain constrain no layer yet, and # they are axes anyway so adding a layer that needs them costs no bump. schema = 2 [attributes] init = ["openrc", "systemd"] multilib = [true, false] desktop = ["none", "generic", "plasma", "gnome"] hardened = [true, false] selinux = [true, false] toolchain = ["gcc", "llvm"] libc = ["glibc", "musl"] # rank orders the parent lines; exclusive allows at most one layer of the type. [types.flavor] rank = 1 exclusive = true [types.mix-in] rank = 2 exclusive = false [types.hardware] rank = 3 exclusive = false # --- presets: one per amd64 line of profiles.desc -------------------------- [[preset]] id = "default/linux/amd64/23.0" status = "stable" init = "openrc" multilib = true desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/systemd" status = "stable" init = "systemd" multilib = true desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop" status = "stable" init = "openrc" multilib = true desktop = "generic" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop/systemd" status = "stable" init = "systemd" multilib = true desktop = "generic" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop/gnome" status = "stable" init = "openrc" multilib = true desktop = "gnome" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop/gnome/systemd" status = "stable" init = "systemd" multilib = true desktop = "gnome" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop/plasma" status = "stable" init = "openrc" multilib = true desktop = "plasma" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/desktop/plasma/systemd" status = "stable" init = "systemd" multilib = true desktop = "plasma" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib" status = "stable" init = "openrc" multilib = false desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib/systemd" status = "stable" init = "systemd" multilib = false desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib/hardened" status = "stable" init = "openrc" multilib = false desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib/hardened/systemd" status = "stable" init = "systemd" multilib = false desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib/hardened/selinux" status = "stable" init = "openrc" multilib = false desktop = "none" hardened = true selinux = true toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/no-multilib/hardened/selinux/systemd" status = "stable" init = "systemd" multilib = false desktop = "none" hardened = true selinux = true toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/hardened" status = "stable" init = "openrc" multilib = true desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/hardened/systemd" status = "stable" init = "systemd" multilib = true desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/hardened/selinux" status = "stable" init = "openrc" multilib = true desktop = "none" hardened = true selinux = true toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/hardened/selinux/systemd" status = "stable" init = "systemd" multilib = true desktop = "none" hardened = true selinux = true toolchain = "gcc" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/llvm" status = "exp" init = "openrc" multilib = true desktop = "none" hardened = false selinux = false toolchain = "llvm" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/llvm/systemd" status = "exp" init = "systemd" multilib = true desktop = "none" hardened = false selinux = false toolchain = "llvm" libc = "glibc" [[preset]] id = "default/linux/amd64/23.0/musl" status = "dev" init = "openrc" multilib = false desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/systemd" status = "dev" init = "systemd" multilib = false desktop = "none" hardened = false selinux = false toolchain = "gcc" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/llvm" status = "exp" init = "openrc" multilib = false desktop = "none" hardened = false selinux = false toolchain = "llvm" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/llvm/systemd" status = "exp" init = "systemd" multilib = false desktop = "none" hardened = false selinux = false toolchain = "llvm" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/hardened" status = "exp" init = "openrc" multilib = false desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/hardened/systemd" status = "exp" init = "systemd" multilib = false desktop = "none" hardened = true selinux = false toolchain = "gcc" libc = "musl" [[preset]] id = "default/linux/amd64/23.0/musl/hardened/selinux" status = "exp" init = "openrc" multilib = false desktop = "none" hardened = true selinux = true toolchain = "gcc" libc = "musl" # --- flavors: what the machine is for. At most one. ------------------------- # Declared in this order on purpose: check-profile-matrix.sh builds the # "largest allowed selection" from the first compatible flavor, and container # first would exclude every hardware layer from that check. [[layer]] id = "targets/workstation" type = "flavor" description = "Desktop for daily work: NetworkManager, printing, scanning, Flatpak" base = { desktop = ["generic", "plasma", "gnome"] } services = [ { openrc = "NetworkManager", systemd = "NetworkManager.service" }, { openrc = "cupsd", systemd = "cups.service" }, ] [[layer]] id = "targets/server" type = "flavor" description = "Network services, no graphical stack" base = { desktop = ["none"] } has_files = true services = [{ openrc = "sshd", systemd = "sshd.service" }] [[layer]] id = "targets/headless" type = "flavor" description = "Appliance or edge box: no display, no documentation, no service added" base = { desktop = ["none"] } [[layer]] id = "targets/container" type = "flavor" description = "Container image: no kernel, firmware or bootloader" base = { desktop = ["none"] } conflicts = [ "features/hardware/nvidia", "features/hardware/nvidia-legacy", "features/hardware/amd", "features/hardware/intel", ] # --- mix-ins: optional traits, any number. ---------------------------------- [[layer]] id = "features/games" type = "mix-in" description = "Gaming: 32-bit graphics stack and gamemode" # gamemode needs elogind or systemd, which no desktop = none preset enables; # gaming without a display has no user either. base = { multilib = [true], desktop = ["generic", "plasma", "gnome"] } # --- hardware: any number; a hybrid laptop selects two. --------------------- [[layer]] id = "features/hardware/nvidia" type = "hardware" description = "NVIDIA proprietary driver (current branch, Turing and newer)" # ::gentoo profiles/features/musl/package.mask masks x11-drivers/nvidia-drivers: # "nvidia-drivers only works against glibc." base = { libc = ["glibc"] } conflicts = ["features/hardware/nvidia-legacy", "targets/container"] has_files = true services = [{ openrc = "nvidia-persistenced", systemd = "nvidia-persistenced.service" }] [[layer]] id = "features/hardware/nvidia-legacy" type = "hardware" description = "NVIDIA proprietary driver held on the 580.x branch (Pascal)" # ::gentoo profiles/features/musl/package.mask masks x11-drivers/nvidia-drivers: # "nvidia-drivers only works against glibc." base = { libc = ["glibc"] } conflicts = ["features/hardware/nvidia", "targets/container"] has_files = true services = [{ openrc = "nvidia-persistenced", systemd = "nvidia-persistenced.service" }] [[layer]] id = "features/hardware/amd" type = "hardware" description = "AMD GPU: firmware and Vulkan; ROCm via USE" conflicts = ["targets/container"] [[layer]] id = "features/hardware/intel" type = "hardware" description = "Intel GPU: firmware, VA-API media driver and Vulkan; oneAPI via USE" conflicts = ["targets/container"]