1bc3fdd6aSArnaldo Carvalho de Melo#!/bin/bash 2bc3fdd6aSArnaldo Carvalho de Melo# SPDX-License-Identifier: GPL-2.0 3bc3fdd6aSArnaldo Carvalho de Melo# 4bc3fdd6aSArnaldo Carvalho de Melo# No 'set -e': the script uses explicit checks for its error paths, and 5bc3fdd6aSArnaldo Carvalho de Melo# is also run via '$(SHELL) .../install-build-deps.sh' from the make 6bc3fdd6aSArnaldo Carvalho de Melo# target in tools/perf/Makefile.perf, where a shebang option would be 7bc3fdd6aSArnaldo Carvalho de Melo# ignored anyway, so direct and make-driven runs behave the same. 8bc3fdd6aSArnaldo Carvalho de Melo# 9bc3fdd6aSArnaldo Carvalho de Melo# Install the development packages needed to build tools/perf. 10bc3fdd6aSArnaldo Carvalho de Melo# 11bc3fdd6aSArnaldo Carvalho de Melo# The package set is derived from the feature tests in tools/build/feature/: 12bc3fdd6aSArnaldo Carvalho de Melo# each feature test that perf may compile is mapped to the devel package 13bc3fdd6aSArnaldo Carvalho de Melo# that provides the headers/libraries it checks, so that a subsequent 14bc3fdd6aSArnaldo Carvalho de Melo# 'make -C tools/perf' build enables the corresponding perf features. 15bc3fdd6aSArnaldo Carvalho de Melo# 161331bb51SArnaldo Carvalho de Melo# Currently supported distros, each validated in a fresh container: 179f83597eSArnaldo Carvalho de Melo# 189f83597eSArnaldo Carvalho de Melo# - Fedora, on dnf, validated on Fedora 44, in a toolbx container: 199f83597eSArnaldo Carvalho de Melo# 209f83597eSArnaldo Carvalho de Melo# toolbox create fedora:44 219f83597eSArnaldo Carvalho de Melo# toolbox enter fedora:44 22bc3fdd6aSArnaldo Carvalho de Melo# 231331bb51SArnaldo Carvalho de Melo# - Ubuntu, on apt-get, validated on Ubuntu 26.04, in a distrobox 241331bb51SArnaldo Carvalho de Melo# container: 251331bb51SArnaldo Carvalho de Melo# 261331bb51SArnaldo Carvalho de Melo# distrobox create --image ubuntu:26.04 271331bb51SArnaldo Carvalho de Melo# distrobox enter ubuntu-26-04 281331bb51SArnaldo Carvalho de Melo# 291331bb51SArnaldo Carvalho de Melo# The apt-get install runs with a noninteractive debconf frontend: 301331bb51SArnaldo Carvalho de Melo# default-jdk, needed by the jvmti feature tests, pulls in tzdata, 311331bb51SArnaldo Carvalho de Melo# which prompts for the timezone on a terminal and would block the 321331bb51SArnaldo Carvalho de Melo# install, e.g. in a container shared with an interactive session. 331331bb51SArnaldo Carvalho de Melo# 3401c7a389SArnaldo Carvalho de Melo# - Debian, on apt-get, reusing the Ubuntu mapping, validated on 3501c7a389SArnaldo Carvalho de Melo# Debian 13 (trixie), in a distrobox container: 3601c7a389SArnaldo Carvalho de Melo# 3701c7a389SArnaldo Carvalho de Melo# distrobox create --image debian:trixie 3801c7a389SArnaldo Carvalho de Melo# distrobox enter debian-trixie 3901c7a389SArnaldo Carvalho de Melo# 40*d17c5b77SArnaldo Carvalho de Melo# - RHEL and its variants (RHEL, CentOS Stream, Rocky Linux, AlmaLinux, 41*d17c5b77SArnaldo Carvalho de Melo# Oracle Linux), on dnf (RHEL 8 and later), validated on CentOS 42*d17c5b77SArnaldo Carvalho de Melo# Stream 10, in a distrobox container: 431331bb51SArnaldo Carvalho de Melo# 44*d17c5b77SArnaldo Carvalho de Melo# distrobox create --image quay.io/centos/centos:stream10 45*d17c5b77SArnaldo Carvalho de Melo# distrobox enter centos-stream10 46*d17c5b77SArnaldo Carvalho de Melo# 47*d17c5b77SArnaldo Carvalho de Melo# The RHEL family reuses most Fedora package names, with these 48*d17c5b77SArnaldo Carvalho de Melo# differences, handled by probing the enabled repos: 49*d17c5b77SArnaldo Carvalho de Melo# 50*d17c5b77SArnaldo Carvalho de Melo# - zlib.h comes from zlib-ng-compat-devel on the RHEL 10 family, 51*d17c5b77SArnaldo Carvalho de Melo# zlib-devel on RHEL 9 and earlier; 52*d17c5b77SArnaldo Carvalho de Melo# - the JDK devel package is versioned, there is no 53*d17c5b77SArnaldo Carvalho de Melo# java-latest-openjdk-devel: java-21-openjdk-devel on the RHEL 54*d17c5b77SArnaldo Carvalho de Melo# 10 family, java-17-openjdk-devel on RHEL 9, java-11-openjdk- 55*d17c5b77SArnaldo Carvalho de Melo# devel on RHEL 8; 56*d17c5b77SArnaldo Carvalho de Melo# - libbpf-devel and capstone-devel are in the CRB repo on RHEL 57*d17c5b77SArnaldo Carvalho de Melo# and CentOS Stream 10 ('dnf config-manager --set-enabled crb') 58*d17c5b77SArnaldo Carvalho de Melo# and in EPEL on RHEL 9 and earlier; 59*d17c5b77SArnaldo Carvalho de Melo# - libbabeltrace2-devel is not packaged on the RHEL 10 family. 60*d17c5b77SArnaldo Carvalho de Melo# 61*d17c5b77SArnaldo Carvalho de Melo# On the RHEL family, packages not available on the enabled repos 62*d17c5b77SArnaldo Carvalho de Melo# are skipped and listed at the end of the run, so that a distro 63*d17c5b77SArnaldo Carvalho de Melo# with CRB/EPEL enabled gets the full set, and a distro without 64*d17c5b77SArnaldo Carvalho de Melo# them still installs what it can. 65*d17c5b77SArnaldo Carvalho de Melo# 66*d17c5b77SArnaldo Carvalho de Melo# Running inside a container keeps the host system unmodified. 671331bb51SArnaldo Carvalho de Melo# 68bc3fdd6aSArnaldo Carvalho de Melo# Usage: install-build-deps.sh [OPTIONS] 69bc3fdd6aSArnaldo Carvalho de Melo# 70bc3fdd6aSArnaldo Carvalho de Melo# Options: 71bc3fdd6aSArnaldo Carvalho de Melo# --list list the packages that would be installed, then exit 72bc3fdd6aSArnaldo Carvalho de Melo# --dry-run show the install command that would be run, without 73bc3fdd6aSArnaldo Carvalho de Melo# running it 74*d17c5b77SArnaldo Carvalho de Melo# --distro ID force a distro: fedora, rhel, ubuntu, debian 75*d17c5b77SArnaldo Carvalho de Melo# (default: auto-detect) 76bc3fdd6aSArnaldo Carvalho de Melo# -h, --help print this help message 77bc3fdd6aSArnaldo Carvalho de Melo# 78bc3fdd6aSArnaldo Carvalho de Melo# Requires root (or passwordless sudo) to actually install packages. 79bc3fdd6aSArnaldo Carvalho de Melo 80bc3fdd6aSArnaldo Carvalho de Meloset -u 81bc3fdd6aSArnaldo Carvalho de Melo 82bc3fdd6aSArnaldo Carvalho de MeloDISTRO="" 83bc3fdd6aSArnaldo Carvalho de Melo 84bc3fdd6aSArnaldo Carvalho de Melohelp() { 85bc3fdd6aSArnaldo Carvalho de Melo cat <<EOF 86bc3fdd6aSArnaldo Carvalho de MeloUsage: $(basename "$0") [--list] [--dry-run] [--distro ID] [-h|--help] 87bc3fdd6aSArnaldo Carvalho de Melo 88bc3fdd6aSArnaldo Carvalho de MeloInstall the development packages needed to build tools/perf. 89bc3fdd6aSArnaldo Carvalho de Melo 909f83597eSArnaldo Carvalho de MeloThe package set is derived from the feature tests in tools/build/feature/, 919f83597eSArnaldo Carvalho de Melomapping each one with an external dependency to the devel package providing 929f83597eSArnaldo Carvalho de Meloit, so the corresponding feature gets enabled on a build. 939f83597eSArnaldo Carvalho de Melo 94bc3fdd6aSArnaldo Carvalho de MeloOptions: 95bc3fdd6aSArnaldo Carvalho de Melo --list list the packages that would be installed, then exit 96bc3fdd6aSArnaldo Carvalho de Melo --dry-run show the install command that would be run, without running it 97*d17c5b77SArnaldo Carvalho de Melo --distro ID force a distro: fedora, rhel, ubuntu, debian 98bc3fdd6aSArnaldo Carvalho de Melo -h, --help print this help message 999f83597eSArnaldo Carvalho de Melo 1001331bb51SArnaldo Carvalho de MeloDistros supported: Fedora (dnf), validated in a toolbx container on 10101c7a389SArnaldo Carvalho de MeloFedora 44, Ubuntu (apt-get), validated in a distrobox container on 102*d17c5b77SArnaldo Carvalho de MeloUbuntu 26.04, Debian (apt-get), reusing the Ubuntu mapping, validated 103*d17c5b77SArnaldo Carvalho de Meloin a distrobox container on Debian 13 (trixie), and the RHEL family 104*d17c5b77SArnaldo Carvalho de Melo(dnf, RHEL 8 and later), validated on CentOS Stream 10 in a distrobox 105*d17c5b77SArnaldo Carvalho de Melocontainer. On the RHEL family, packages not available on the enabled 106*d17c5b77SArnaldo Carvalho de Melorepos are skipped and listed at the end; some there, e.g. 107*d17c5b77SArnaldo Carvalho de Melolibbpf-devel and capstone-devel, come from the CRB repo on RHEL and 108*d17c5b77SArnaldo Carvalho de MeloCentOS Stream 10 ('dnf config-manager --set-enabled crb') and from 109*d17c5b77SArnaldo Carvalho de MeloEPEL on RHEL 9 and earlier. 110bc3fdd6aSArnaldo Carvalho de MeloEOF 111bc3fdd6aSArnaldo Carvalho de Melo exit 0 112bc3fdd6aSArnaldo Carvalho de Melo} 113bc3fdd6aSArnaldo Carvalho de Melo 114bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 1159f83597eSArnaldo Carvalho de Melo# Return the Fedora package(s) providing the devel requirements of a 1169f83597eSArnaldo Carvalho de Melo# feature test in tools/build/feature/. Multiple packages are separated 1179f83597eSArnaldo Carvalho de Melo# by spaces; an empty result means the test has no external devel 1189f83597eSArnaldo Carvalho de Melo# dependency (pure toolchain/glibc, or no equivalent Fedora package). 1199f83597eSArnaldo Carvalho de Melo# 1209f83597eSArnaldo Carvalho de Melo# The mapping was built by checking, for each feature test, which Fedora 1219f83597eSArnaldo Carvalho de Melo# devel package provides the headers the test compiles against. 1229f83597eSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 1239f83597eSArnaldo Carvalho de Melofedora_pkg_for() { 1249f83597eSArnaldo Carvalho de Melo local feat="$1" 1259f83597eSArnaldo Carvalho de Melo case "$feat" in 1269f83597eSArnaldo Carvalho de Melo libelf|libelf-getphdrnum|libelf-gelf_getnote|libelf-getshdrstrndx) 1279f83597eSArnaldo Carvalho de Melo echo "elfutils-libelf-devel" 1289f83597eSArnaldo Carvalho de Melo ;; 1299f83597eSArnaldo Carvalho de Melo libelf-zstd) 1309f83597eSArnaldo Carvalho de Melo echo "elfutils-libelf-devel libzstd-devel" 1319f83597eSArnaldo Carvalho de Melo ;; 1329f83597eSArnaldo Carvalho de Melo libdw) 1339f83597eSArnaldo Carvalho de Melo echo "elfutils-devel" 1349f83597eSArnaldo Carvalho de Melo ;; 1359f83597eSArnaldo Carvalho de Melo # test-libdebuginfod.c includes <elfutils/debuginfod.h>, which is 1369f83597eSArnaldo Carvalho de Melo # provided by elfutils-debuginfod-client-devel, not elfutils-devel. 1379f83597eSArnaldo Carvalho de Melo libdebuginfod) 1389f83597eSArnaldo Carvalho de Melo echo "elfutils-debuginfod-client-devel" 1399f83597eSArnaldo Carvalho de Melo ;; 1409f83597eSArnaldo Carvalho de Melo libnuma|numa_num_possible_cpus) 1419f83597eSArnaldo Carvalho de Melo echo "numactl-devel" 1429f83597eSArnaldo Carvalho de Melo ;; 1439f83597eSArnaldo Carvalho de Melo libzstd) 1449f83597eSArnaldo Carvalho de Melo echo "libzstd-devel" 1459f83597eSArnaldo Carvalho de Melo ;; 1469f83597eSArnaldo Carvalho de Melo zlib) 1479f83597eSArnaldo Carvalho de Melo echo "zlib-devel" 1489f83597eSArnaldo Carvalho de Melo ;; 1499f83597eSArnaldo Carvalho de Melo lzma) 1509f83597eSArnaldo Carvalho de Melo echo "xz-devel" 1519f83597eSArnaldo Carvalho de Melo ;; 1529f83597eSArnaldo Carvalho de Melo libslang) 1539f83597eSArnaldo Carvalho de Melo echo "slang-devel" 1549f83597eSArnaldo Carvalho de Melo ;; 1559f83597eSArnaldo Carvalho de Melo libcapstone) 1569f83597eSArnaldo Carvalho de Melo echo "capstone-devel" 1579f83597eSArnaldo Carvalho de Melo ;; 1589f83597eSArnaldo Carvalho de Melo libpython) 1599f83597eSArnaldo Carvalho de Melo echo "python3-devel" 1609f83597eSArnaldo Carvalho de Melo ;; 1619f83597eSArnaldo Carvalho de Melo libtraceevent) 1629f83597eSArnaldo Carvalho de Melo echo "libtraceevent-devel" 1639f83597eSArnaldo Carvalho de Melo ;; 1649f83597eSArnaldo Carvalho de Melo cxa-demangle) 1659f83597eSArnaldo Carvalho de Melo echo "libstdc++-devel" 1669f83597eSArnaldo Carvalho de Melo ;; 1679f83597eSArnaldo Carvalho de Melo libbpf) 1689f83597eSArnaldo Carvalho de Melo echo "libbpf-devel" 1699f83597eSArnaldo Carvalho de Melo ;; 1709f83597eSArnaldo Carvalho de Melo babeltrace2-ctf-writer) 1719f83597eSArnaldo Carvalho de Melo echo "libbabeltrace2-devel" 1729f83597eSArnaldo Carvalho de Melo ;; 1739f83597eSArnaldo Carvalho de Melo libopenssl) 1749f83597eSArnaldo Carvalho de Melo echo "openssl-devel" 1759f83597eSArnaldo Carvalho de Melo ;; 1769f83597eSArnaldo Carvalho de Melo libpfm4) 1779f83597eSArnaldo Carvalho de Melo echo "libpfm-devel" 1789f83597eSArnaldo Carvalho de Melo ;; 1799f83597eSArnaldo Carvalho de Melo sdt) 1809f83597eSArnaldo Carvalho de Melo echo "systemtap-sdt-devel" 1819f83597eSArnaldo Carvalho de Melo ;; 1829f83597eSArnaldo Carvalho de Melo clang-bpf-co-re) 1839f83597eSArnaldo Carvalho de Melo echo "clang-devel" 1849f83597eSArnaldo Carvalho de Melo ;; 1859f83597eSArnaldo Carvalho de Melo llvm|llvm-perf) 1869f83597eSArnaldo Carvalho de Melo echo "llvm-devel" 1879f83597eSArnaldo Carvalho de Melo ;; 1889f83597eSArnaldo Carvalho de Melo jvmti|jvmti-cmlr) 1899f83597eSArnaldo Carvalho de Melo echo "java-latest-openjdk-devel" 1909f83597eSArnaldo Carvalho de Melo ;; 1919f83597eSArnaldo Carvalho de Melo esac 1929f83597eSArnaldo Carvalho de Melo # Pure toolchain/libc features (backtrace, eventfd, fortify-source, 1939f83597eSArnaldo Carvalho de Melo # gettid, glibc, hello, reallocarray, pthread-*, stackprotector-all, 1949f83597eSArnaldo Carvalho de Melo # timerfd, scandirat, sched_getcpu, setns, file-handle, 1959f83597eSArnaldo Carvalho de Melo # bionic...) need no external package: their 1969f83597eSArnaldo Carvalho de Melo # requirements are covered by the base packages below. Features that 1979f83597eSArnaldo Carvalho de Melo # perf's own build does not check (libcap, libcheck, libcpupower, 1989f83597eSArnaldo Carvalho de Melo # libtracefs, whose feature tests exist for rtla/bpftool/rv) and the 1999f83597eSArnaldo Carvalho de Melo # opt-in features, which a default build does not enable: the libbfd 2009f83597eSArnaldo Carvalho de Melo # disassembler family (libbfd, libbfd-threadsafe, libbfd-liberty, 2019f83597eSArnaldo Carvalho de Melo # disassembler-*, cplus-demangle), only linked on BUILD_NONDISTRO 2029f83597eSArnaldo Carvalho de Melo # builds and deprecated in favor of capstone, GTK2, LIBPERL and 2039f83597eSArnaldo Carvalho de Melo # LIBUNWIND support (ifdef GTK2 / ifdef LIBPERL / LIBUNWIND=1), 2049f83597eSArnaldo Carvalho de Melo # and CoreSight (ifdef CORESIGHT), are deliberately not mapped. 2059f83597eSArnaldo Carvalho de Melo # libaio is not mapped either: its 2069f83597eSArnaldo Carvalho de Melo # test uses the POSIX AIO API (aio.h, aio_*, -lrt), provided by 2071331bb51SArnaldo Carvalho de Melo # glibc headers (pulled in by the libc headers package) in the 2081331bb51SArnaldo Carvalho de Melo # base set, not the native libaio.h/io_submit API that 2091331bb51SArnaldo Carvalho de Melo # libaio-devel provides. 2109f83597eSArnaldo Carvalho de Melo} 2119f83597eSArnaldo Carvalho de Melo 2129f83597eSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 213*d17c5b77SArnaldo Carvalho de Melo# Check whether the first argument is provided by the enabled repos, or 214*d17c5b77SArnaldo Carvalho de Melo# is already installed, returning 0 if so and printing nothing. 215*d17c5b77SArnaldo Carvalho de Melo# 216*d17c5b77SArnaldo Carvalho de Melo# dnf repoquery exits 0 even when the pattern does not match anything, 217*d17c5b77SArnaldo Carvalho de Melo# so availability is judged by the output being non-empty, not by the 218*d17c5b77SArnaldo Carvalho de Melo# exit code. 219*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 220*d17c5b77SArnaldo Carvalho de Melopkg_available() { 221*d17c5b77SArnaldo Carvalho de Melo local p out 222*d17c5b77SArnaldo Carvalho de Melo for p in "$@"; do 223*d17c5b77SArnaldo Carvalho de Melo out=$(dnf repoquery --quiet --available "$p" 2>/dev/null) 224*d17c5b77SArnaldo Carvalho de Melo [ -n "$out" ] || out=$(dnf repoquery --quiet --installed "$p" 2>/dev/null) 225*d17c5b77SArnaldo Carvalho de Melo [ -n "$out" ] && return 0 226*d17c5b77SArnaldo Carvalho de Melo done 227*d17c5b77SArnaldo Carvalho de Melo return 1 228*d17c5b77SArnaldo Carvalho de Melo} 229*d17c5b77SArnaldo Carvalho de Melo 230*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 231*d17c5b77SArnaldo Carvalho de Melo# Return the first of its arguments that pkg_available() accepts. 232*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 233*d17c5b77SArnaldo Carvalho de Melopick_available() { 234*d17c5b77SArnaldo Carvalho de Melo local p 235*d17c5b77SArnaldo Carvalho de Melo for p in "$@"; do 236*d17c5b77SArnaldo Carvalho de Melo if pkg_available "$p"; then 237*d17c5b77SArnaldo Carvalho de Melo echo "$p" 238*d17c5b77SArnaldo Carvalho de Melo return 0 239*d17c5b77SArnaldo Carvalho de Melo fi 240*d17c5b77SArnaldo Carvalho de Melo done 241*d17c5b77SArnaldo Carvalho de Melo return 1 242*d17c5b77SArnaldo Carvalho de Melo} 243*d17c5b77SArnaldo Carvalho de Melo 244*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 245*d17c5b77SArnaldo Carvalho de Melo# Return the RHEL-family package(s) providing the devel requirements of 246*d17c5b77SArnaldo Carvalho de Melo# a feature test. This family reuses the Fedora mapping, whose names 247*d17c5b77SArnaldo Carvalho de Melo# apply to it as well, except for the features whose Fedora package 248*d17c5b77SArnaldo Carvalho de Melo# does not exist there, kept in the case below. 249*d17c5b77SArnaldo Carvalho de Melo# 250*d17c5b77SArnaldo Carvalho de Melo# Whether the resulting package is actually installable is checked in 251*d17c5b77SArnaldo Carvalho de Melo# package_set(), as some of these names live in the CRB or EPEL repos, 252*d17c5b77SArnaldo Carvalho de Melo# which may not be enabled: on the RHEL 10 family libbpf-devel and 253*d17c5b77SArnaldo Carvalho de Melo# capstone-devel come from CRB, and libbabeltrace2-devel is not 254*d17c5b77SArnaldo Carvalho de Melo# packaged at all. 255*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 256*d17c5b77SArnaldo Carvalho de Melorhel_pkg_for() { 257*d17c5b77SArnaldo Carvalho de Melo local feat="$1" 258*d17c5b77SArnaldo Carvalho de Melo case "$feat" in 259*d17c5b77SArnaldo Carvalho de Melo zlib) 260*d17c5b77SArnaldo Carvalho de Melo # zlib-ng-compat-devel on the RHEL 10 family, zlib-devel on 261*d17c5b77SArnaldo Carvalho de Melo # RHEL 9 and earlier. If neither is on the enabled repos, 262*d17c5b77SArnaldo Carvalho de Melo # fall back to the first candidate so that package_set() 263*d17c5b77SArnaldo Carvalho de Melo # reports it as missing instead of silently dropping the 264*d17c5b77SArnaldo Carvalho de Melo # feature from the end-of-run note. 265*d17c5b77SArnaldo Carvalho de Melo pick_available zlib-devel zlib-ng-compat-devel || echo "zlib-devel" 266*d17c5b77SArnaldo Carvalho de Melo ;; 267*d17c5b77SArnaldo Carvalho de Melo jvmti|jvmti-cmlr) 268*d17c5b77SArnaldo Carvalho de Melo # No java-latest-openjdk-devel on the RHEL family: the JDK 269*d17c5b77SArnaldo Carvalho de Melo # devel package is versioned per release. 270*d17c5b77SArnaldo Carvalho de Melo pick_available java-latest-openjdk-devel java-21-openjdk-devel java-17-openjdk-devel java-11-openjdk-devel || echo "java-latest-openjdk-devel" 271*d17c5b77SArnaldo Carvalho de Melo ;; 272*d17c5b77SArnaldo Carvalho de Melo *) 273*d17c5b77SArnaldo Carvalho de Melo fedora_pkg_for "$feat" 274*d17c5b77SArnaldo Carvalho de Melo ;; 275*d17c5b77SArnaldo Carvalho de Melo esac 276*d17c5b77SArnaldo Carvalho de Melo} 277*d17c5b77SArnaldo Carvalho de Melo 278*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 2791331bb51SArnaldo Carvalho de Melo# Return the Debian/Ubuntu package(s) providing the devel requirements 2801331bb51SArnaldo Carvalho de Melo# of a feature test in tools/build/feature/. This mapping is shared by 2811331bb51SArnaldo Carvalho de Melo# Debian and Ubuntu, whose package names for these devel packages match, 28201c7a389SArnaldo Carvalho de Melo# and is validated on Ubuntu 26.04 and Debian 13 (trixie). 2831331bb51SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 2841331bb51SArnaldo Carvalho de Melodebian_pkg_for() { 2851331bb51SArnaldo Carvalho de Melo local feat="$1" 2861331bb51SArnaldo Carvalho de Melo case "$feat" in 2871331bb51SArnaldo Carvalho de Melo libelf|libelf-getphdrnum|libelf-gelf_getnote|libelf-getshdrstrndx) 2881331bb51SArnaldo Carvalho de Melo echo "libelf-dev" 2891331bb51SArnaldo Carvalho de Melo ;; 2901331bb51SArnaldo Carvalho de Melo libelf-zstd) 2911331bb51SArnaldo Carvalho de Melo echo "libelf-dev libzstd-dev" 2921331bb51SArnaldo Carvalho de Melo ;; 2931331bb51SArnaldo Carvalho de Melo libdw) 2941331bb51SArnaldo Carvalho de Melo echo "libdw-dev" 2951331bb51SArnaldo Carvalho de Melo ;; 2961331bb51SArnaldo Carvalho de Melo libdebuginfod) 2971331bb51SArnaldo Carvalho de Melo echo "libdebuginfod-dev" 2981331bb51SArnaldo Carvalho de Melo ;; 2991331bb51SArnaldo Carvalho de Melo libnuma|numa_num_possible_cpus) 3001331bb51SArnaldo Carvalho de Melo echo "libnuma-dev" 3011331bb51SArnaldo Carvalho de Melo ;; 3021331bb51SArnaldo Carvalho de Melo libzstd) 3031331bb51SArnaldo Carvalho de Melo echo "libzstd-dev" 3041331bb51SArnaldo Carvalho de Melo ;; 3051331bb51SArnaldo Carvalho de Melo zlib) 3061331bb51SArnaldo Carvalho de Melo echo "zlib1g-dev" 3071331bb51SArnaldo Carvalho de Melo ;; 3081331bb51SArnaldo Carvalho de Melo lzma) 3091331bb51SArnaldo Carvalho de Melo echo "liblzma-dev" 3101331bb51SArnaldo Carvalho de Melo ;; 3111331bb51SArnaldo Carvalho de Melo libslang) 3121331bb51SArnaldo Carvalho de Melo echo "libslang2-dev" 3131331bb51SArnaldo Carvalho de Melo ;; 3141331bb51SArnaldo Carvalho de Melo libcapstone) 3151331bb51SArnaldo Carvalho de Melo echo "libcapstone-dev" 3161331bb51SArnaldo Carvalho de Melo ;; 3171331bb51SArnaldo Carvalho de Melo libpython) 3181331bb51SArnaldo Carvalho de Melo echo "python3-dev" 3191331bb51SArnaldo Carvalho de Melo ;; 3201331bb51SArnaldo Carvalho de Melo libtraceevent) 3211331bb51SArnaldo Carvalho de Melo echo "libtraceevent-dev" 3221331bb51SArnaldo Carvalho de Melo ;; 3231331bb51SArnaldo Carvalho de Melo # The cxa-demangle feature test links against libstdc++ builtin 3241331bb51SArnaldo Carvalho de Melo # demangling, so on Debian-derived distros it is covered by the 3251331bb51SArnaldo Carvalho de Melo # g++ base package below, which pulls in libstdc++-*-dev. 3261331bb51SArnaldo Carvalho de Melo cxa-demangle) 3271331bb51SArnaldo Carvalho de Melo ;; 3281331bb51SArnaldo Carvalho de Melo libbpf) 3291331bb51SArnaldo Carvalho de Melo echo "libbpf-dev" 3301331bb51SArnaldo Carvalho de Melo ;; 3311331bb51SArnaldo Carvalho de Melo babeltrace2-ctf-writer) 3321331bb51SArnaldo Carvalho de Melo echo "libbabeltrace2-dev" 3331331bb51SArnaldo Carvalho de Melo ;; 3341331bb51SArnaldo Carvalho de Melo libopenssl) 3351331bb51SArnaldo Carvalho de Melo echo "libssl-dev" 3361331bb51SArnaldo Carvalho de Melo ;; 3371331bb51SArnaldo Carvalho de Melo libpfm4) 3381331bb51SArnaldo Carvalho de Melo echo "libpfm4-dev" 3391331bb51SArnaldo Carvalho de Melo ;; 3401331bb51SArnaldo Carvalho de Melo sdt) 3411331bb51SArnaldo Carvalho de Melo echo "systemtap-sdt-dev" 3421331bb51SArnaldo Carvalho de Melo ;; 3431331bb51SArnaldo Carvalho de Melo # test-clang-bpf-co-re.c invokes the clang binary (not libclang-cpp), 3441331bb51SArnaldo Carvalho de Melo # so clang suffices; llvm-dev brings llvm-config, needed by the 3451331bb51SArnaldo Carvalho de Melo # llvm/llvm-perf tests below. 3461331bb51SArnaldo Carvalho de Melo clang-bpf-co-re) 3471331bb51SArnaldo Carvalho de Melo echo "clang llvm-dev" 3481331bb51SArnaldo Carvalho de Melo ;; 3491331bb51SArnaldo Carvalho de Melo llvm|llvm-perf) 3501331bb51SArnaldo Carvalho de Melo echo "llvm-dev" 3511331bb51SArnaldo Carvalho de Melo ;; 3521331bb51SArnaldo Carvalho de Melo jvmti|jvmti-cmlr) 3531331bb51SArnaldo Carvalho de Melo echo "default-jdk" 3541331bb51SArnaldo Carvalho de Melo ;; 3551331bb51SArnaldo Carvalho de Melo esac 3561331bb51SArnaldo Carvalho de Melo # Same rationale as in fedora_pkg_for() above for unmapped tests. 3571331bb51SArnaldo Carvalho de Melo} 3581331bb51SArnaldo Carvalho de Melo 3591331bb51SArnaldo Carvalho de Melo# Base packages needed by any perf build, regardless of feature tests: 3601331bb51SArnaldo Carvalho de Melo# compiler, libc headers, flex/bison for the parser, kernel headers 3611331bb51SArnaldo Carvalho de Melo# for UAPI headers with no in-tree copy, e.g. <linux/capability.h>, and 3621331bb51SArnaldo Carvalho de Melo# gcc-c++ (dnf) / g++ (apt) is needed by the C++-based feature tests 3631331bb51SArnaldo Carvalho de Melo# (cxa-demangle, llvm, llvm-perf), compiled with $(CXX), and 3641331bb51SArnaldo Carvalho de Melo# pulls in libstdc++-devel / libstdc++-*-dev. 3651331bb51SArnaldo Carvalho de Melo# python3-setuptools is needed to build the python binding (perf's 3661331bb51SArnaldo Carvalho de Melo# util/setup.py uses it; without it binding is skipped with a warning). 3671331bb51SArnaldo Carvalho de Melo# rust is not a header-based feature test: test-rust.bin just checks 3681331bb51SArnaldo Carvalho de Melo# "$(RUSTC) --version" (tools/build/feature/Makefile), so it is mapped 3691331bb51SArnaldo Carvalho de Melo# here like the other toolchain packages. 3701331bb51SArnaldo Carvalho de Melofedora_base_pkgs="gcc gcc-c++ make flex bison glibc-devel kernel-headers python3-setuptools rust" 3711331bb51SArnaldo Carvalho de Melo# pkg-config mirrors the pkgconf-pkg-config package that Fedora 3721331bb51SArnaldo Carvalho de Melo# installs by default, needed by the babeltrace2 feature test and 3731331bb51SArnaldo Carvalho de Melo# libopenssl's pkg-config checks. 3741331bb51SArnaldo Carvalho de Melodebian_base_pkgs="gcc g++ make pkg-config flex bison libc6-dev linux-libc-dev python3-setuptools rustc" 375*d17c5b77SArnaldo Carvalho de Melo# pkg-config: like Fedora, on pkgconf since Fedora 26 / RHEL 8, with 376*d17c5b77SArnaldo Carvalho de Melo# 'pkgconfig' live only as a virtual Provides of the pkgconf-pkg-config 377*d17c5b77SArnaldo Carvalho de Melo# subpackage. List it explicitly because, unlike Fedora, a minimal 378*d17c5b77SArnaldo Carvalho de Melo# RHEL-family container may not have it preinstalled. 379*d17c5b77SArnaldo Carvalho de Melorhel_base_pkgs="gcc gcc-c++ make flex bison glibc-devel kernel-headers pkgconf-pkg-config python3-setuptools rust" 3801331bb51SArnaldo Carvalho de Melo 3811331bb51SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 3829f83597eSArnaldo Carvalho de Melo# Distro detection 383bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 384bc3fdd6aSArnaldo Carvalho de Melodetect_distro() { 385bc3fdd6aSArnaldo Carvalho de Melo if [ -n "$DISTRO" ]; then 386bc3fdd6aSArnaldo Carvalho de Melo echo "$DISTRO" 387bc3fdd6aSArnaldo Carvalho de Melo return 388bc3fdd6aSArnaldo Carvalho de Melo fi 389bc3fdd6aSArnaldo Carvalho de Melo local id 390bc3fdd6aSArnaldo Carvalho de Melo id=$( . /etc/os-release 2>/dev/null && echo "${ID:-}" ) 391bc3fdd6aSArnaldo Carvalho de Melo case "$id" in 392bc3fdd6aSArnaldo Carvalho de Melo fedora) echo "fedora" ;; 393*d17c5b77SArnaldo Carvalho de Melo rhel|centos|rocky|almalinux|ol) 394*d17c5b77SArnaldo Carvalho de Melo # All share the Fedora package names (with the exceptions 395*d17c5b77SArnaldo Carvalho de Melo # handled by rhel_pkg_for()) and dnf. 396*d17c5b77SArnaldo Carvalho de Melo echo "rhel" ;; 397bc3fdd6aSArnaldo Carvalho de Melo ubuntu) echo "ubuntu" ;; 39801c7a389SArnaldo Carvalho de Melo debian) echo "debian" ;; 399bc3fdd6aSArnaldo Carvalho de Melo *) echo "" ;; 400bc3fdd6aSArnaldo Carvalho de Melo esac 401bc3fdd6aSArnaldo Carvalho de Melo} 402bc3fdd6aSArnaldo Carvalho de Melo 4039f83597eSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 4049f83597eSArnaldo Carvalho de Melo# Feature test enumeration: mirror of the tests checked during a build, 4059f83597eSArnaldo Carvalho de Melo# from the actual test-*.c / test-*.cpp sources in tools/build/feature/. 4069f83597eSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 4079f83597eSArnaldo Carvalho de Melofeature_tests() { 4089f83597eSArnaldo Carvalho de Melo local srcdir="$1" 4099f83597eSArnaldo Carvalho de Melo local f 4109f83597eSArnaldo Carvalho de Melo for f in "$srcdir"/tools/build/feature/test-*.c "$srcdir"/tools/build/feature/test-*.cpp; do 4119f83597eSArnaldo Carvalho de Melo [ -e "$f" ] || continue 4129f83597eSArnaldo Carvalho de Melo basename "$f" | sed -e 's/^test-//' -e 's/\.c$//' -e 's/\.cpp$//' 4139f83597eSArnaldo Carvalho de Melo done 4149f83597eSArnaldo Carvalho de Melo} 4159f83597eSArnaldo Carvalho de Melo 416bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 4171331bb51SArnaldo Carvalho de Melo# Assemble the unique package list. Since the full feature set is mapped 4181331bb51SArnaldo Carvalho de Melo# unconditionally, this installs the complete devel environment; installing 4191331bb51SArnaldo Carvalho de Melo# an already-present package is a no-op for both dnf and apt-get, making 420*d17c5b77SArnaldo Carvalho de Melo# this idempotent. On the RHEL family, packages not available on the 421*d17c5b77SArnaldo Carvalho de Melo# enabled repos are skipped and echoed on stderr, reported at the end of 422*d17c5b77SArnaldo Carvalho de Melo# the run by the caller (package_set() runs in a subshell, so a variable 423*d17c5b77SArnaldo Carvalho de Melo# would not survive it). 424bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 425bc3fdd6aSArnaldo Carvalho de Melopackage_set() { 426bc3fdd6aSArnaldo Carvalho de Melo local distro="$1" srcdir="$2" 427*d17c5b77SArnaldo Carvalho de Melo local feat pkg pkgs base_pkgs missing_pkgs="" 428bc3fdd6aSArnaldo Carvalho de Melo case "$distro" in 4299f83597eSArnaldo Carvalho de Melo fedora) pkgs="$fedora_base_pkgs" ;; 430*d17c5b77SArnaldo Carvalho de Melo rhel) pkgs="$rhel_base_pkgs" ;; 43101c7a389SArnaldo Carvalho de Melo ubuntu|debian) pkgs="$debian_base_pkgs" ;; 432bc3fdd6aSArnaldo Carvalho de Melo esac 4339f83597eSArnaldo Carvalho de Melo 434*d17c5b77SArnaldo Carvalho de Melo # The base set must be checked against the enabled repos as well: 435*d17c5b77SArnaldo Carvalho de Melo # e.g. 'rust' is only shipped as the rust-toolset AppStream module 436*d17c5b77SArnaldo Carvalho de Melo # on RHEL 8 and 9, where dnf would abort the whole transaction 437*d17c5b77SArnaldo Carvalho de Melo # with "No match for argument: rust" instead of skipping it, so 438*d17c5b77SArnaldo Carvalho de Melo # unavailable base packages are skipped and noted like the mapped 439*d17c5b77SArnaldo Carvalho de Melo # ones below. 440*d17c5b77SArnaldo Carvalho de Melo if [ "$distro" = "rhel" ]; then 441*d17c5b77SArnaldo Carvalho de Melo base_pkgs="$pkgs" 442*d17c5b77SArnaldo Carvalho de Melo pkgs="" 443*d17c5b77SArnaldo Carvalho de Melo for pkg in $base_pkgs; do 444*d17c5b77SArnaldo Carvalho de Melo if pkg_available "$pkg"; then 445*d17c5b77SArnaldo Carvalho de Melo pkgs="$pkgs $pkg" 4461331bb51SArnaldo Carvalho de Melo else 447*d17c5b77SArnaldo Carvalho de Melo missing_pkgs="$missing_pkgs $pkg" 4481331bb51SArnaldo Carvalho de Melo fi 449*d17c5b77SArnaldo Carvalho de Melo done 450*d17c5b77SArnaldo Carvalho de Melo fi 451*d17c5b77SArnaldo Carvalho de Melo 452*d17c5b77SArnaldo Carvalho de Melo for feat in $(feature_tests "$srcdir"); do 453*d17c5b77SArnaldo Carvalho de Melo case "$distro" in 454*d17c5b77SArnaldo Carvalho de Melo fedora) pkg=$(fedora_pkg_for "$feat") ;; 455*d17c5b77SArnaldo Carvalho de Melo rhel) pkg=$(rhel_pkg_for "$feat") ;; 456*d17c5b77SArnaldo Carvalho de Melo *) pkg=$(debian_pkg_for "$feat") ;; 457*d17c5b77SArnaldo Carvalho de Melo esac 458*d17c5b77SArnaldo Carvalho de Melo # An empty result means the feature test has no external devel 459*d17c5b77SArnaldo Carvalho de Melo # dependency (see the unmapped list in fedora_pkg_for()), so 460*d17c5b77SArnaldo Carvalho de Melo # there is nothing to install and nothing to report as missing: 461*d17c5b77SArnaldo Carvalho de Melo # packages that are genuinely unavailable on the RHEL family 462*d17c5b77SArnaldo Carvalho de Melo # surface through rhel_pkg_for() falling back to its first 463*d17c5b77SArnaldo Carvalho de Melo # candidate, so that the pkg_available() check below catches 464*d17c5b77SArnaldo Carvalho de Melo # them and adds them to missing_pkgs. 4651331bb51SArnaldo Carvalho de Melo [ -n "$pkg" ] || continue 4669f83597eSArnaldo Carvalho de Melo for pkg in $pkg; do 467*d17c5b77SArnaldo Carvalho de Melo if [ "$distro" = "rhel" ] && ! pkg_available "$pkg"; then 468*d17c5b77SArnaldo Carvalho de Melo missing_pkgs="$missing_pkgs $pkg" 469*d17c5b77SArnaldo Carvalho de Melo continue 470*d17c5b77SArnaldo Carvalho de Melo fi 4719f83597eSArnaldo Carvalho de Melo case " $pkgs " in 4729f83597eSArnaldo Carvalho de Melo *" $pkg "*) ;; 4739f83597eSArnaldo Carvalho de Melo *) pkgs="$pkgs $pkg" ;; 4749f83597eSArnaldo Carvalho de Melo esac 4759f83597eSArnaldo Carvalho de Melo done 4769f83597eSArnaldo Carvalho de Melo done 477*d17c5b77SArnaldo Carvalho de Melo [ -n "$missing_pkgs" ] && echo "$missing_pkgs" >&2 4789f83597eSArnaldo Carvalho de Melo echo "$pkgs" 479bc3fdd6aSArnaldo Carvalho de Melo} 480bc3fdd6aSArnaldo Carvalho de Melo 481bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 482*d17c5b77SArnaldo Carvalho de Melo# Report the RHEL-family packages that were skipped because the enabled 483*d17c5b77SArnaldo Carvalho de Melo# repos do not provide them. 484*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 485*d17c5b77SArnaldo Carvalho de Melonote_missing() { 486*d17c5b77SArnaldo Carvalho de Melo [ -n "$1" ] || return 0 487*d17c5b77SArnaldo Carvalho de Melo echo "Note: these packages are not available on the enabled repos" >&2 488*d17c5b77SArnaldo Carvalho de Melo echo "and were not installed, so the features they enable will stay" >&2 489*d17c5b77SArnaldo Carvalho de Melo echo "off in a perf build:" >&2 490*d17c5b77SArnaldo Carvalho de Melo echo "$1" | tr ' ' '\n' | grep -v '^$' | sort -u | sed 's/^/ /' >&2 491*d17c5b77SArnaldo Carvalho de Melo echo >&2 492*d17c5b77SArnaldo Carvalho de Melo} 493*d17c5b77SArnaldo Carvalho de Melo 494*d17c5b77SArnaldo Carvalho de Melo# --------------------------------------------------------------------- 495bc3fdd6aSArnaldo Carvalho de Melo# The install command proper for each supported package manager, plus 496bc3fdd6aSArnaldo Carvalho de Melo# the command massaged for --dry-run. 497bc3fdd6aSArnaldo Carvalho de Melo# --------------------------------------------------------------------- 498bc3fdd6aSArnaldo Carvalho de Meloinstall_cmd() { 499bc3fdd6aSArnaldo Carvalho de Melo local distro="$1"; shift 500bc3fdd6aSArnaldo Carvalho de Melo case "$distro" in 501*d17c5b77SArnaldo Carvalho de Melo fedora|rhel) 502bc3fdd6aSArnaldo Carvalho de Melo echo "dnf install -y $*" 503bc3fdd6aSArnaldo Carvalho de Melo ;; 50401c7a389SArnaldo Carvalho de Melo ubuntu|debian) 5051331bb51SArnaldo Carvalho de Melo # a fresh container has no package index, so update first; run 5061331bb51SArnaldo Carvalho de Melo # with a noninteractive debconf frontend: default-jdk, used by 5071331bb51SArnaldo Carvalho de Melo # the jvmti feature tests, pulls in tzdata, which prompts for 5081331bb51SArnaldo Carvalho de Melo # the timezone on a terminal and would block the install. The 5091331bb51SArnaldo Carvalho de Melo # env var prefix works with the 'sh -c' invocation below, and 5101331bb51SArnaldo Carvalho de Melo # shows up in --dry-run. 5111331bb51SArnaldo Carvalho de Melo echo "DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $*" 512bc3fdd6aSArnaldo Carvalho de Melo ;; 513bc3fdd6aSArnaldo Carvalho de Melo esac 514bc3fdd6aSArnaldo Carvalho de Melo} 515bc3fdd6aSArnaldo Carvalho de Melo 516bc3fdd6aSArnaldo Carvalho de Melomain() { 517bc3fdd6aSArnaldo Carvalho de Melo local action="install" 5181331bb51SArnaldo Carvalho de Melo # Package accumulation happens in package_set(), which, together 5191331bb51SArnaldo Carvalho de Melo # with the *_pkg_for() helpers, declares the per-feature 'pkg' 5201331bb51SArnaldo Carvalho de Melo # locals; main() holds no per-feature package state, just the 5211331bb51SArnaldo Carvalho de Melo # distro-wide list assembled by package_set(). 522*d17c5b77SArnaldo Carvalho de Melo local srcdir distro pkgs cmd missing_file missing_pkgs 523bc3fdd6aSArnaldo Carvalho de Melo 524bc3fdd6aSArnaldo Carvalho de Melo while [ $# -gt 0 ]; do 525bc3fdd6aSArnaldo Carvalho de Melo case "$1" in 526bc3fdd6aSArnaldo Carvalho de Melo --list) action="list"; shift ;; 527bc3fdd6aSArnaldo Carvalho de Melo --dry-run) action="dry-run"; shift ;; 528bc3fdd6aSArnaldo Carvalho de Melo --distro) 529bc3fdd6aSArnaldo Carvalho de Melo [ $# -ge 2 ] || { 530bc3fdd6aSArnaldo Carvalho de Melo echo "error: --distro requires an argument (fedora, rhel, ubuntu, debian)" >&2 531bc3fdd6aSArnaldo Carvalho de Melo exit 1 532bc3fdd6aSArnaldo Carvalho de Melo } 533bc3fdd6aSArnaldo Carvalho de Melo DISTRO="$2"; shift 2 ;; 534bc3fdd6aSArnaldo Carvalho de Melo -h|--help) help ;; 535bc3fdd6aSArnaldo Carvalho de Melo *) echo "error: unknown argument: $1" >&2; exit 1 ;; 536bc3fdd6aSArnaldo Carvalho de Melo esac 537bc3fdd6aSArnaldo Carvalho de Melo done 538bc3fdd6aSArnaldo Carvalho de Melo 539bc3fdd6aSArnaldo Carvalho de Melo srcdir=$(cd "$(dirname "$0")/../../.." && pwd) 540bc3fdd6aSArnaldo Carvalho de Melo distro=$(detect_distro) 541bc3fdd6aSArnaldo Carvalho de Melo case "$distro" in 542*d17c5b77SArnaldo Carvalho de Melo fedora|rhel|ubuntu|debian) ;; 543bc3fdd6aSArnaldo Carvalho de Melo *) 544bc3fdd6aSArnaldo Carvalho de Melo echo "error: unsupported distro (got '$distro'); the package mapping is not validated on other distros." >&2 545*d17c5b77SArnaldo Carvalho de Melo echo "Supported and validated: Fedora 44 (toolbx container), Ubuntu 26.04 and Debian 13 (distrobox containers), and CentOS Stream 10 (distrobox container)." >&2 546bc3fdd6aSArnaldo Carvalho de Melo exit 1 547bc3fdd6aSArnaldo Carvalho de Melo ;; 548bc3fdd6aSArnaldo Carvalho de Melo esac 549bc3fdd6aSArnaldo Carvalho de Melo 550*d17c5b77SArnaldo Carvalho de Melo # The RHEL family mapping probes the enabled repos with dnf 551*d17c5b77SArnaldo Carvalho de Melo # repoquery and installs with dnf, so reject the yum-only members of 552*d17c5b77SArnaldo Carvalho de Melo # the family (RHEL 7 and earlier, e.g. Oracle Linux 7) with a clear 553*d17c5b77SArnaldo Carvalho de Melo # error instead of silently judging every package as unavailable. 554*d17c5b77SArnaldo Carvalho de Melo if [ "$distro" = "rhel" ] && ! command -v dnf >/dev/null 2>&1; then 555*d17c5b77SArnaldo Carvalho de Melo echo "error: dnf not found, the RHEL family package mapping requires dnf (RHEL 8 and later)." >&2 556*d17c5b77SArnaldo Carvalho de Melo exit 1 557*d17c5b77SArnaldo Carvalho de Melo fi 558*d17c5b77SArnaldo Carvalho de Melo 559*d17c5b77SArnaldo Carvalho de Melo missing_file=$(mktemp) || { 560*d17c5b77SArnaldo Carvalho de Melo echo "error: cannot create a temporary file (mktemp failed)" >&2 561*d17c5b77SArnaldo Carvalho de Melo exit 1 562*d17c5b77SArnaldo Carvalho de Melo } 563*d17c5b77SArnaldo Carvalho de Melo # package_set() runs in a subshell, doing dnf repoquery loops that 564*d17c5b77SArnaldo Carvalho de Melo # may be interrupted: a Ctrl-C during those loops hits these traps, 565*d17c5b77SArnaldo Carvalho de Melo # turning SIGINT/SIGTERM into an exit that triggers the EXIT trap, 566*d17c5b77SArnaldo Carvalho de Melo # removing the temp file, so the script terminates instead of 567*d17c5b77SArnaldo Carvalho de Melo # resuming after the interrupted command, leaving no file behind. 568*d17c5b77SArnaldo Carvalho de Melo trap 'rm -f "$missing_file"' EXIT 569*d17c5b77SArnaldo Carvalho de Melo trap 'exit 1' INT TERM 570*d17c5b77SArnaldo Carvalho de Melo pkgs=$(package_set "$distro" "$srcdir" 2>"$missing_file") 571*d17c5b77SArnaldo Carvalho de Melo missing_pkgs=$(cat "$missing_file") 572*d17c5b77SArnaldo Carvalho de Melo rm -f "$missing_file" 573*d17c5b77SArnaldo Carvalho de Melo trap - EXIT INT TERM 574bc3fdd6aSArnaldo Carvalho de Melo 575bc3fdd6aSArnaldo Carvalho de Melo case "$action" in 576bc3fdd6aSArnaldo Carvalho de Melo list) 577bc3fdd6aSArnaldo Carvalho de Melo echo "$pkgs" | tr ' ' '\n' | grep -v '^$' | sort 578*d17c5b77SArnaldo Carvalho de Melo note_missing "$missing_pkgs" 579bc3fdd6aSArnaldo Carvalho de Melo exit 0 580bc3fdd6aSArnaldo Carvalho de Melo ;; 581bc3fdd6aSArnaldo Carvalho de Melo dry-run) 582bc3fdd6aSArnaldo Carvalho de Melo install_cmd "$distro" $pkgs 583*d17c5b77SArnaldo Carvalho de Melo note_missing "$missing_pkgs" 584bc3fdd6aSArnaldo Carvalho de Melo exit 0 585bc3fdd6aSArnaldo Carvalho de Melo ;; 586bc3fdd6aSArnaldo Carvalho de Melo esac 587bc3fdd6aSArnaldo Carvalho de Melo 588bc3fdd6aSArnaldo Carvalho de Melo echo "The following packages will be installed to enable perf features:" 589bc3fdd6aSArnaldo Carvalho de Melo echo "$pkgs" | tr ' ' '\n' | grep -v '^$' | sort | sed 's/^/ /' 590bc3fdd6aSArnaldo Carvalho de Melo echo 591bc3fdd6aSArnaldo Carvalho de Melo cmd=$(install_cmd "$distro" $pkgs) 592bc3fdd6aSArnaldo Carvalho de Melo if [ "$(id -u)" -eq 0 ]; then 593bc3fdd6aSArnaldo Carvalho de Melo sh -c "$cmd" 594bc3fdd6aSArnaldo Carvalho de Melo else 595bc3fdd6aSArnaldo Carvalho de Melo sudo sh -c "$cmd" 596bc3fdd6aSArnaldo Carvalho de Melo fi || { 597bc3fdd6aSArnaldo Carvalho de Melo echo "error: the install command failed, see the output above" >&2 598bc3fdd6aSArnaldo Carvalho de Melo exit 1 599bc3fdd6aSArnaldo Carvalho de Melo } 600*d17c5b77SArnaldo Carvalho de Melo note_missing "$missing_pkgs" 601bc3fdd6aSArnaldo Carvalho de Melo} 602bc3fdd6aSArnaldo Carvalho de Melo 603bc3fdd6aSArnaldo Carvalho de Melomain "$@" 604