mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
perf build: install-build-deps: add Ubuntu devel package mapping
With the framework and Fedora mapping in place, this patch adds the
Ubuntu (apt) mapping: same feature-to-package correspondence as the
Fedora one, adapted to Debian packaging conventions (libfoo-dev), on
a per-distro dispatch so future distros can pick their own mapping or
reuse one of these (Debian shares the Ubuntu mapping).
Notable differences from Fedora:
- base set: g++ (ships libstdc++-*-dev, covering cxa-demangle),
pkg-config (installed implicitly by Fedora's default toolchain
metapackage, but not by Ubuntu's), linux-libc-dev and libc6-dev
instead of kernel-headers and glibc-devel, and rustc for rust;
- cxa-demangle maps to nothing, covered by g++'s libstdc++;
- the clang-bpf-co-re test needs the clang compiler binary (Fedora's
clang-devel provides it transitively), and llvm-dev, which also
brings llvm-config (deps on the llvm package), used by the
llvm/llvm-perf tests;
- libslang maps to libslang2-dev and jvmti to default-jdk;
- the install command runs 'apt-get update' first since a fresh
container has no package indexes, unlike dnf.
Validated on a fresh Ubuntu 26.04 distrobox container so the host
system is not modified:
distrobox create --image ubuntu:26.04
distrobox enter ubuntu-26-04
make -C tools/perf install-build-deps
which installed the 29 mapped packages; a subsequent clean O= build
enabled every feature with an external dependency Ubuntu has a
package for: perf's build-options then showed all of them [on],
including the BPF skeletons requiring clang/llvm, the python binding
and the C++-based features, with only the deliberately unmapped
(deprecated) libbfd family, libperl and libunwind [OFF], and the
build linked libpfm, libbabeltrace2-ctf-writer, libcapstone,
libtraceevent, libslang, libnuma, libdw and libssl. Re-running the
target is a no-op (apt-get reports "0 newly installed").
Debian (trixie) is the next planned distro: it shares this Ubuntu
mapping, so enabling it reuses it as-is, once it gets validated on a
Debian release.
Example of its --list:
$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Fedora Linux 44 (Toolbx Container Image)"
$ tools/perf/scripts/install-build-deps.sh --list --distro ubuntu
bison
clang
default-jdk
flex
g++
gcc
libbabeltrace2-dev
libbpf-dev
libc6-dev
libcapstone-dev
libdebuginfod-dev
libdw-dev
libelf-dev
liblzma-dev
libnuma-dev
libpfm4-dev
libslang2-dev
libssl-dev
libtraceevent-dev
libzstd-dev
linux-libc-dev
llvm-dev
make
pkg-config
python3-dev
python3-setuptools
rustc
systemtap-sdt-dev
zlib1g-dev
$
Assisted-by: opencode:deepseek-v4-flash-free
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
9f83597eb5
commit
1331bb5106
|
|
@ -899,9 +899,9 @@ install-bin: install-tools install-tests
|
|||
install: install-bin try-install-man
|
||||
|
||||
# Install the development packages needed to build perf, derived from the
|
||||
# feature tests in tools/build/feature/. This first installs just the
|
||||
# base toolchain; per-distro package mappings are added by the follow-up
|
||||
# commits. INSTALL_BUILD_DEPS_ARGS, when set, is passed to the script, so
|
||||
# feature tests in tools/build/feature/. Currently supported: the Fedora
|
||||
# (dnf) and Ubuntu (apt) package mappings, see the script.
|
||||
# INSTALL_BUILD_DEPS_ARGS, when set, is passed to the script, so
|
||||
# extra options like --list, --dry-run or --distro can be given from make.
|
||||
install-build-deps:
|
||||
$(Q)$(SHELL) $(srctree)/tools/perf/scripts/install-build-deps.sh $(INSTALL_BUILD_DEPS_ARGS)
|
||||
|
|
|
|||
|
|
@ -13,21 +13,38 @@
|
|||
# that provides the headers/libraries it checks, so that a subsequent
|
||||
# 'make -C tools/perf' build enables the corresponding perf features.
|
||||
#
|
||||
# Supported distros, each mapping validated in a fresh container, so the
|
||||
# host system is not modified:
|
||||
# Currently supported distros, each validated in a fresh container:
|
||||
#
|
||||
# - Fedora, on dnf, validated on Fedora 44, in a toolbx container:
|
||||
#
|
||||
# toolbox create fedora:44
|
||||
# toolbox enter fedora:44
|
||||
#
|
||||
# - Ubuntu, on apt-get, validated on Ubuntu 26.04, in a distrobox
|
||||
# container:
|
||||
#
|
||||
# distrobox create --image ubuntu:26.04
|
||||
# distrobox enter ubuntu-26-04
|
||||
#
|
||||
# The apt-get install runs with a noninteractive debconf frontend:
|
||||
# default-jdk, needed by the jvmti feature tests, pulls in tzdata,
|
||||
# which prompts for the timezone on a terminal and would block the
|
||||
# install, e.g. in a container shared with an interactive session.
|
||||
#
|
||||
# Running inside a container keeps the host system unmodified.
|
||||
#
|
||||
# Debian, which shares the Ubuntu package mapping, is the next planned
|
||||
# distro to be enabled once that mapping is validated on a Debian
|
||||
# release (trixie), as is RHEL support, once its (largely similar to
|
||||
# Fedora) package mapping is validated there.
|
||||
#
|
||||
# Usage: install-build-deps.sh [OPTIONS]
|
||||
#
|
||||
# Options:
|
||||
# --list list the packages that would be installed, then exit
|
||||
# --dry-run show the install command that would be run, without
|
||||
# running it
|
||||
# --distro ID force a distro: fedora (default: auto-detect)
|
||||
# --distro ID force a distro: fedora, ubuntu (default: auto-detect)
|
||||
# -h, --help print this help message
|
||||
#
|
||||
# Requires root (or passwordless sudo) to actually install packages.
|
||||
|
|
@ -49,11 +66,12 @@ it, so the corresponding feature gets enabled on a build.
|
|||
Options:
|
||||
--list list the packages that would be installed, then exit
|
||||
--dry-run show the install command that would be run, without running it
|
||||
--distro ID force a distro: fedora
|
||||
--distro ID force a distro: fedora, ubuntu
|
||||
-h, --help print this help message
|
||||
|
||||
Distro supported: Fedora (dnf), validated on a fresh Fedora 44 toolbx
|
||||
container.
|
||||
Distros supported: Fedora (dnf), validated in a toolbx container on
|
||||
Fedora 44, and Ubuntu (apt-get), validated in a distrobox container on
|
||||
Ubuntu 26.04.
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
|
@ -151,10 +169,110 @@ fedora_pkg_for() {
|
|||
# and CoreSight (ifdef CORESIGHT), are deliberately not mapped.
|
||||
# libaio is not mapped either: its
|
||||
# test uses the POSIX AIO API (aio.h, aio_*, -lrt), provided by
|
||||
# glibc headers (pulled in by the glibc-devel base package), not
|
||||
# the native libaio.h/io_submit API that libaio-devel provides.
|
||||
# glibc headers (pulled in by the libc headers package) in the
|
||||
# base set, not the native libaio.h/io_submit API that
|
||||
# libaio-devel provides.
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# Return the Debian/Ubuntu package(s) providing the devel requirements
|
||||
# of a feature test in tools/build/feature/. This mapping is shared by
|
||||
# Debian and Ubuntu, whose package names for these devel packages match,
|
||||
# and is validated on Ubuntu 26.04; Debian (trixie) will be enabled
|
||||
# once the same mapping is validated on it.
|
||||
# ---------------------------------------------------------------------
|
||||
debian_pkg_for() {
|
||||
local feat="$1"
|
||||
case "$feat" in
|
||||
libelf|libelf-getphdrnum|libelf-gelf_getnote|libelf-getshdrstrndx)
|
||||
echo "libelf-dev"
|
||||
;;
|
||||
libelf-zstd)
|
||||
echo "libelf-dev libzstd-dev"
|
||||
;;
|
||||
libdw)
|
||||
echo "libdw-dev"
|
||||
;;
|
||||
libdebuginfod)
|
||||
echo "libdebuginfod-dev"
|
||||
;;
|
||||
libnuma|numa_num_possible_cpus)
|
||||
echo "libnuma-dev"
|
||||
;;
|
||||
libzstd)
|
||||
echo "libzstd-dev"
|
||||
;;
|
||||
zlib)
|
||||
echo "zlib1g-dev"
|
||||
;;
|
||||
lzma)
|
||||
echo "liblzma-dev"
|
||||
;;
|
||||
libslang)
|
||||
echo "libslang2-dev"
|
||||
;;
|
||||
libcapstone)
|
||||
echo "libcapstone-dev"
|
||||
;;
|
||||
libpython)
|
||||
echo "python3-dev"
|
||||
;;
|
||||
libtraceevent)
|
||||
echo "libtraceevent-dev"
|
||||
;;
|
||||
# The cxa-demangle feature test links against libstdc++ builtin
|
||||
# demangling, so on Debian-derived distros it is covered by the
|
||||
# g++ base package below, which pulls in libstdc++-*-dev.
|
||||
cxa-demangle)
|
||||
;;
|
||||
libbpf)
|
||||
echo "libbpf-dev"
|
||||
;;
|
||||
babeltrace2-ctf-writer)
|
||||
echo "libbabeltrace2-dev"
|
||||
;;
|
||||
libopenssl)
|
||||
echo "libssl-dev"
|
||||
;;
|
||||
libpfm4)
|
||||
echo "libpfm4-dev"
|
||||
;;
|
||||
sdt)
|
||||
echo "systemtap-sdt-dev"
|
||||
;;
|
||||
# test-clang-bpf-co-re.c invokes the clang binary (not libclang-cpp),
|
||||
# so clang suffices; llvm-dev brings llvm-config, needed by the
|
||||
# llvm/llvm-perf tests below.
|
||||
clang-bpf-co-re)
|
||||
echo "clang llvm-dev"
|
||||
;;
|
||||
llvm|llvm-perf)
|
||||
echo "llvm-dev"
|
||||
;;
|
||||
jvmti|jvmti-cmlr)
|
||||
echo "default-jdk"
|
||||
;;
|
||||
esac
|
||||
# Same rationale as in fedora_pkg_for() above for unmapped tests.
|
||||
}
|
||||
|
||||
# Base packages needed by any perf build, regardless of feature tests:
|
||||
# compiler, libc headers, flex/bison for the parser, kernel headers
|
||||
# for UAPI headers with no in-tree copy, e.g. <linux/capability.h>, and
|
||||
# gcc-c++ (dnf) / g++ (apt) is needed by the C++-based feature tests
|
||||
# (cxa-demangle, llvm, llvm-perf), compiled with $(CXX), and
|
||||
# pulls in libstdc++-devel / libstdc++-*-dev.
|
||||
# python3-setuptools is needed to build the python binding (perf's
|
||||
# util/setup.py uses it; without it binding is skipped with a warning).
|
||||
# rust is not a header-based feature test: test-rust.bin just checks
|
||||
# "$(RUSTC) --version" (tools/build/feature/Makefile), so it is mapped
|
||||
# here like the other toolchain packages.
|
||||
fedora_base_pkgs="gcc gcc-c++ make flex bison glibc-devel kernel-headers python3-setuptools rust"
|
||||
# pkg-config mirrors the pkgconf-pkg-config package that Fedora
|
||||
# installs by default, needed by the babeltrace2 feature test and
|
||||
# libopenssl's pkg-config checks.
|
||||
debian_base_pkgs="gcc g++ make pkg-config flex bison libc6-dev linux-libc-dev python3-setuptools rustc"
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# Distro detection
|
||||
# ---------------------------------------------------------------------
|
||||
|
|
@ -168,6 +286,9 @@ detect_distro() {
|
|||
case "$id" in
|
||||
fedora) echo "fedora" ;;
|
||||
ubuntu) echo "ubuntu" ;;
|
||||
# Debian shares the Ubuntu package mapping, but it is only validated
|
||||
# on Ubuntu so far, so don't auto-detect it yet.
|
||||
debian) echo "" ;;
|
||||
# RHEL and its derivatives share most Fedora package names, but the
|
||||
# mapping is only validated on Fedora, so don't auto-detect them.
|
||||
rhel|centos|rocky|alma|ol) echo "" ;;
|
||||
|
|
@ -188,44 +309,34 @@ feature_tests() {
|
|||
done
|
||||
}
|
||||
|
||||
# Base packages needed by any build, regardless of feature tests:
|
||||
# compiler, libc headers, flex/bison for the parser, kernel headers
|
||||
# for UAPI headers with no in-tree copy, e.g. <linux/capability.h>, and
|
||||
# gcc-c++ is needed by the C++-based feature tests (cxa-demangle, llvm,
|
||||
# llvm-perf), which are compiled with $(CXX), pulling in
|
||||
# libstdc++-devel. python3-setuptools is needed to build the python
|
||||
# (perf's util/setup.py uses it); rust is checked by the rust feature
|
||||
# test (test-rust.bin just runs "$(RUSTC) --version").
|
||||
|
||||
fedora_base_pkgs="gcc gcc-c++ make flex bison glibc-devel kernel-headers python3-setuptools rust"
|
||||
debian_base_pkgs="gcc g++ make flex bison libc6-dev linux-libc-dev python3-setuptools rustc"
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# Assemble the unique package list: the base toolchain plus, for each
|
||||
# feature test the distro's package mapping knows about, its package(s).
|
||||
# Installing an already-present package is a no-op for both dnf and
|
||||
# apt-get, making this idempotent.
|
||||
# Assemble the unique package list. Since the full feature set is mapped
|
||||
# unconditionally, this installs the complete devel environment; installing
|
||||
# an already-present package is a no-op for both dnf and apt-get, making
|
||||
# this idempotent.
|
||||
# ---------------------------------------------------------------------
|
||||
package_set() {
|
||||
local distro="$1" srcdir="$2"
|
||||
local feat pkg pkgs
|
||||
|
||||
case "$distro" in
|
||||
fedora) pkgs="$fedora_base_pkgs" ;;
|
||||
ubuntu) pkgs="$debian_base_pkgs" ;;
|
||||
esac
|
||||
|
||||
if [ "$distro" = "fedora" ]; then
|
||||
for feat in $(feature_tests "$srcdir"); do
|
||||
for feat in $(feature_tests "$srcdir"); do
|
||||
if [ "$distro" = "fedora" ]; then
|
||||
pkg=$(fedora_pkg_for "$feat")
|
||||
for pkg in $pkg; do
|
||||
case " $pkgs " in
|
||||
*" $pkg "*) ;;
|
||||
*) pkgs="$pkgs $pkg" ;;
|
||||
esac
|
||||
done
|
||||
else
|
||||
pkg=$(debian_pkg_for "$feat")
|
||||
fi
|
||||
[ -n "$pkg" ] || continue
|
||||
for pkg in $pkg; do
|
||||
case " $pkgs " in
|
||||
*" $pkg "*) ;;
|
||||
*) pkgs="$pkgs $pkg" ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
done
|
||||
echo "$pkgs"
|
||||
}
|
||||
|
||||
|
|
@ -240,14 +351,23 @@ install_cmd() {
|
|||
echo "dnf install -y $*"
|
||||
;;
|
||||
ubuntu)
|
||||
# a fresh container has no package index, so update first.
|
||||
echo "apt-get update && apt-get install -y $*"
|
||||
# a fresh container has no package index, so update first; run
|
||||
# with a noninteractive debconf frontend: default-jdk, used by
|
||||
# the jvmti feature tests, pulls in tzdata, which prompts for
|
||||
# the timezone on a terminal and would block the install. The
|
||||
# env var prefix works with the 'sh -c' invocation below, and
|
||||
# shows up in --dry-run.
|
||||
echo "DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $*"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main() {
|
||||
local action="install"
|
||||
# Package accumulation happens in package_set(), which, together
|
||||
# with the *_pkg_for() helpers, declares the per-feature 'pkg'
|
||||
# locals; main() holds no per-feature package state, just the
|
||||
# distro-wide list assembled by package_set().
|
||||
local srcdir distro pkgs cmd
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
|
|
@ -271,7 +391,7 @@ main() {
|
|||
fedora|ubuntu) ;;
|
||||
*)
|
||||
echo "error: unsupported distro (got '$distro'); the package mapping is not validated on other distros." >&2
|
||||
echo "Supported and validated: Fedora 44 (fresh toolbx container)." >&2
|
||||
echo "Supported and validated: Fedora 44 (toolbx container), Ubuntu 26.04 (distrobox container)." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
@ -303,4 +423,4 @@ main() {
|
|||
}
|
||||
}
|
||||
|
||||
main "$@"
|
||||
main "$@"
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user