xref: /linux/tools/perf/scripts/install-build-deps.sh (revision 67f8bc848ee31831336bd478e57d2f993551902e)
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