diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2026-08-11 15:28:57 -0300 |
|---|---|---|
| committer | Namhyung Kim <namhyung@kernel.org> | 2026-08-12 06:17:48 -0700 |
| commit | 1331bb51069bd9ddde63a22d493d773801ea3bfc (patch) | |
| tree | 4d093995c21a87d271c82784fa0de49232995663 /tools/perf | |
| parent | 9f83597eb5716531ceb171aee6aab0115c130dac (diff) | |
| download | linux-next-1331bb51069bd9ddde63a22d493d773801ea3bfc.tar.gz linux-next-1331bb51069bd9ddde63a22d493d773801ea3bfc.zip | |
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>
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/Makefile.perf | 6 | ||||
| -rwxr-xr-x | tools/perf/scripts/install-build-deps.sh | 196 |
2 files changed, 161 insertions, 41 deletions
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 49a58d714e42..e1fc75b4621f 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -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) diff --git a/tools/perf/scripts/install-build-deps.sh b/tools/perf/scripts/install-build-deps.sh index a0ec73cb4fcd..5e30cfd1e091 100755 --- a/tools/perf/scripts/install-build-deps.sh +++ b/tools/perf/scripts/install-build-deps.sh @@ -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 "$@"
\ No newline at end of file +main "$@" |
