gentoo/dev-debug/dtrace/dtrace-9999.ebuild
Sam James b70df51dad
dev-debug/dtrace: handle rename affecting tarball layout
In be04841726cae8da2f7589e1d8b30f6f5eab94d0, I naively didn't refetch
the tarballs from upstream so didn't notice that the renamed repo affected
the existing autogenerated tarballs from GH. I've diffed them and indeed
it's only the directory name which changed.

Closes: https://bugs.gentoo.org/971212
Fixes: be04841726cae8da2f7589e1d8b30f6f5eab94d0
Signed-off-by: Sam James <sam@gentoo.org>
2026-03-16 09:25:03 +00:00

234 lines
6.2 KiB
Bash

# Copyright 2024-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit edo flag-o-matic linux-info multilib systemd toolchain-funcs udev
DESCRIPTION="Dynamic BPF-based system-wide tracing tool"
HOMEPAGE="https://github.com/oracle/dtrace https://wiki.gentoo.org/wiki/DTrace"
if [[ ${PV} == 9999 ]]; then
EGIT_BRANCH="devel"
EGIT_REPO_URI="https://github.com/oracle/dtrace"
inherit git-r3
else
SRC_URI="https://github.com/oracle/dtrace/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"
KEYWORDS="-* ~amd64 ~arm64"
fi
LICENSE="UPL-1.0"
SLOT="0"
IUSE="test-install valgrind"
# TODO: can we make the wireshark dep conditional?
DEPEND="
dev-libs/elfutils
dev-libs/libbpf
dev-libs/libpfm:=
net-analyzer/wireshark[dumpcap]
net-libs/libpcap
>=sys-fs/fuse-3.2.0:3=
>=sys-libs/binutils-libs-2.42:=
virtual/zlib:=
"
RDEPEND="
${DEPEND}
!dev-debug/systemtap[dtrace-symlink(+)]
net-analyzer/wireshark
test-install? (
app-alternatives/bc
app-editors/vim-core
dev-build/make
dev-lang/perl
dev-util/perf
net-fs/nfs-utils
sys-apps/coreutils
sys-fs/xfsprogs
sys-process/time
virtual/jdk
)
"
BDEPEND="
dev-build/make
sys-apps/gawk
sys-devel/bison
>=sys-devel/bpf-toolchain-14.1.0
sys-devel/flex
"
DEPEND+=" valgrind? ( dev-debug/valgrind )"
QA_PRESTRIPPED="
usr/.*/dtrace/testsuite/test/triggers/.*
"
QA_FLAGS_IGNORED="
usr/.*/dtrace/testsuite/test/triggers/.*
"
# TODO: report upstream (bug #938221) although it seems like it's
# not relevant given it's a BPF object.
QA_EXECSTACK="
usr/*/dtrace/bpf_dlib.*
"
pkg_pretend() {
# TODO: optional kernel patches
# Basics for debugging information, BPF
local CONFIG_CHECK="~BPF ~DEBUG_INFO_BTF ~KALLSYMS_ALL"
CONFIG_CHECK+=" ~CUSE"
# Tracing
CONFIG_CHECK+=" ~TRACING"
CONFIG_CHECK+=" ~UPROBES ~UPROBE_EVENTS"
CONFIG_CHECK+=" ~FTRACE ~FTRACE_SYSCALLS ~DYNAMIC_FTRACE ~FUNCTION_TRACER"
CONFIG_CHECK+=" ~FPROBE"
CONFIG_CHECK+=" ~BPF_KPROBE_OVERRIDE ~FUNCTION_ERROR_INJECTION"
# DTrace can fallback to kprobes for fbt but people often want them off
# for security and newer kernels work fine with BPF for that, so
# let's omit it. kprobes are slower and scale poorly.
# https://gcc.gnu.org/PR84052
CONFIG_CHECK+=" !GCC_PLUGIN_RANDSTRUCT"
if use test-install ; then
# See test/modules
CONFIG_CHECK+=" ~EXT4_FS ~ISO9660_FS ~NFS_FS ~RDS ~TUN"
fi
check_extra_config
}
pkg_setup() {
eval unset ${!LC_*} LANG
}
src_configure() {
if tc-is-cross-compiler; then
die "DTrace does not yet support cross-compilation."
fi
tc-export CC
# lld does this by default, so fix that, although lld fails anyway...
# 'LIBDTRACE_1.0' to symbol 'dtrace_provider_modules' failed: symbol not defined
append-ldflags $(test-flags-CCLD -Wl,--undefined-version)
# mold and lld can't cope with some relocation types used, e.g.
# 'test-triggers--usdt-tst-forker-prov.o:(.SUNW_dof): unknown relocation: R_X86_64_GLOB_DAT'
tc-ld-force-bfd
# -fno-semantic-interposition seems to lead to a broken dtrace
# that can't actually obtain results from probes, even trivial examples
# just hang.
filter-flags -fno-semantic-interposition
# While it builds as of 2025-06-08, it's broken at runtime
# in the same way as -fno-semantic-interposition (hangs, no probes fire).
filter-lto
local confargs=(
--disable-dependency-tracking
# TODO: Maybe we should set the UNPRIV_UID to something? -3 is a bit... kludgy
--prefix="${EPREFIX}"/usr
--mandir="${EPREFIX}"/usr/share/man
--docdir="${EPREFIX}"/usr/share/doc/${PF}
--with-systemd
HAVE_LIBCTF=yes
HAVE_BPFV3=yes
HAVE_VALGRIND=$(usex valgrind)
)
edo ./configure "${confargs[@]}"
}
src_compile() {
local myemakeargs=(
verbose=1
$(usev !test-install TRIGGERS='')
)
if use amd64 ; then
! has_multilib_profile && myemakeargs+=( NATIVE_BITNESS_ONLY=1 )
fi
# -j1: https://github.com/oracle/dtrace/issues/82
emake -j1 "${myemakeargs[@]}"
}
src_test() {
# Needs root and is also very time-consuming
:;
}
src_install() {
emake DESTDIR="${D}" -j1 install $(usev test-install install-test)
# We want to strip neither the BPF libraries nor libdtrace.so itself
# as probes attach to some symbols that would get removed otherwise.
dostrip -x "/usr/$(get_libdir)"
# It's a binary (TODO: move it?)
docompress -x /usr/share/doc/${PF}/showUSDT
newinitd "${FILESDIR}"/dtprobed.init dtprobed
}
pkg_postinst() {
# We need a udev reload to pick up the CUSE device node rules.
udev_reload
if [[ -n ${REPLACING_VERSIONS} ]]; then
# TODO: Make this more intelligent wrt comparison
# One option for this is to detect when it's needed (DOF stash layout changes)
# and then e.g. sleep and restart for the user.
if systemd_is_booted ; then
einfo "Restart the DTrace 'dtprobed' service after upgrades once all dtraces are stopped with:"
einfo " systemctl try-restart dtprobed"
else
einfo "Restart the DTrace 'dtprobed' service after upgrades once all dtraces are stopped with:"
einfo " /etc/init.d/dtprobed restart"
fi
else
einfo "See https://wiki.gentoo.org/wiki/DTrace for getting started."
# We can't do magic for people with ROOT=.
if [[ -n ${ROOT} ]] ; then
einfo "Enable and start the DTrace 'dtprobed' service for systemd with:"
einfo " systemctl enable --now dtprobed"
einfo
einfo "Enable and start the DTrace 'dtprobed' service for OpenRC with:"
einfo " rc-update add dtprobed"
einfo " /etc/init.d/dtprobed start"
return
fi
# For first installs, we enable the service and start it.
#
# This is unusual, but the behaviour without dtprobed running
# is untested/unsupported. It's not a network service, it
# has no configuration, reads a single device node, and
# does all parsing within a seccomp jail. It also leads
# to hard-to-diagnose issues because USDT probes won't
# be registered and an application might have already
# started up which needs to be traced.
if systemd_is_booted ; then
ebegin "Enabling & starting DTrace 'dtprobed' service"
systemctl enable --now dtprobed
eend $?
else
ebegin "Enabling DTrace 'dtprobed' service"
rc-update add dtprobed
eend $?
ebegin "Starting DTrace 'dtprobed' service"
rc-service dtprobed start
eend $?
fi
fi
}
pkg_postrm() {
udev_reload
}