public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/gentoo:master commit in: dev-debug/dtrace/, dev-debug/dtrace/files/
@ 2024-08-18 21:34 Sam James
  0 siblings, 0 replies; only message in thread
From: Sam James @ 2024-08-18 21:34 UTC (permalink / raw
  To: gentoo-commits

commit:     de83d17702a7f6b8a14264e2662f4819547040fd
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Mon May  6 17:30:16 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Aug 18 21:28:19 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=de83d177

dev-debug/dtrace: new package, add 2.0.1.1, add 9999

This is the modern incarnation of DTrace. It is now BPF-based and requires
no out-of-tree code or modules.

i.e. it Just Works with sys-kernel/gentoo-kernel[-hardened,debug] (*).

Please see https://wiki.gentoo.org/wiki/DTrace and report any issues.

There is still some pending work to be done for integration in Gentoo:
* Figuring out collision with dev-debug/systemtap
* Wiring up DTrace/systemtap probe support in more packages
* Deciding on consistent naming/global USE for that support

But the tooling works as-is. Enjoy!

(*) -hardened is needed for now because of CONFIG_GCC_PLUGIN_RANDSTRUCT,
see https://gcc.gnu.org/PR84052. Investigation is ongoing on fixing this.

Signed-off-by: Sam James <sam <AT> gentoo.org>

 dev-debug/dtrace/Manifest              |   1 +
 dev-debug/dtrace/dtrace-2.0.1.1.ebuild | 176 +++++++++++++++++++++++++++++++++
 dev-debug/dtrace/dtrace-9999.ebuild    | 176 +++++++++++++++++++++++++++++++++
 dev-debug/dtrace/files/dtprobed.init   |  15 +++
 dev-debug/dtrace/metadata.xml          |  22 +++++
 5 files changed, 390 insertions(+)

diff --git a/dev-debug/dtrace/Manifest b/dev-debug/dtrace/Manifest
new file mode 100644
index 000000000000..554f7f6f5e67
--- /dev/null
+++ b/dev-debug/dtrace/Manifest
@@ -0,0 +1 @@
+DIST dtrace-2.0.1.1.tar.gz 1435524 BLAKE2B 761a931b9d871e9316f11ebe960f6bbfd3c16a82cf1cdd9ae5d69b22e0d8cea8d4b3924c960b7915f8843ce1e5c37bd257a52f1ce346957002b0ab00e59306fb SHA512 15809f2bc996bac9bd6cbb2b03eaa9a0c6a2aea9404642280f14d75b7d6feaec31b5d2c16915255cd202006cdff7835f578c042b087605708a9eb935407f1b95

diff --git a/dev-debug/dtrace/dtrace-2.0.1.1.ebuild b/dev-debug/dtrace/dtrace-2.0.1.1.ebuild
new file mode 100644
index 000000000000..7c697bf009cf
--- /dev/null
+++ b/dev-debug/dtrace/dtrace-2.0.1.1.ebuild
@@ -0,0 +1,176 @@
+# Copyright 2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit edo flag-o-matic linux-info systemd toolchain-funcs udev
+
+DESCRIPTION="Dynamic systemwide tracing tool"
+HOMEPAGE="https://github.com/oracle/dtrace-utils"
+
+if [[ ${PV} == 9999 ]]; then
+	EGIT_BRANCH="devel"
+	EGIT_REPO_URI="https://github.com/oracle/dtrace-utils"
+	inherit git-r3
+else
+	SRC_URI="https://github.com/oracle/dtrace-utils/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"
+	S="${WORKDIR}"/dtrace-utils-${PV}
+
+	KEYWORDS="-* ~amd64"
+fi
+
+LICENSE="UPL-1.0"
+SLOT="0"
+IUSE="install-tests systemd"
+
+# XXX: right now, we auto-adapt to whether multilibs are present:
+# should we force them to be? how?
+#
+# XXX: binutils-libs will need an extra patch for what dtrace does with
+# it in the absence of in-kernel CTF: it will be backported
+# to 2.42, but perhaps a patch would be a good idea before that?
+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:=
+	sys-libs/zlib
+	systemd? ( sys-apps/systemd )
+"
+RDEPEND="
+	${DEPEND}
+	!dev-debug/systemtap
+	net-analyzer/wireshark
+	install-tests? (
+		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
+		virtual/perl-IO-Socket-IP
+	)
+"
+BDEPEND="
+	dev-build/make
+	>=sys-devel/bpf-toolchain-14.1.0
+	sys-apps/gawk
+	sys-devel/bison
+	sys-devel/flex
+"
+
+pkg_pretend() {
+	# TODO: optional kernel patches
+
+	# Basics for debugging information, BPF
+	local CONFIG_CHECK="~BPF ~DEBUG_INFO_BTF ~KALLSYMS_ALL ~CUSE"
+
+	# Tracing
+	# TODO: CONFIG_HAVE_SYSCALL_TRACEPOINTS - is it auto?
+	# TODO: CONFIG_UPROBE_EVENTS maybe?
+	CONFIG_CHECK+=" ~FTRACE_SYSCALLS ~UPROBE_EVENTS ~DYNAMIC_FTRACE ~FUNCTION_TRACER"
+
+	# https://gcc.gnu.org/PR84052
+	CONFIG_CHECK+=" !GCC_PLUGIN_RANDSTRUCT"
+
+	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
+
+	# TODO: Can drop once https://lore.kernel.org/dtrace/20240425164057.420580-1-nick.alcock@oracle.com/ is in
+	# XXX: That wasn't enough, need to report upstream the other issues during build
+	tc-enables-fortify-source && append-cppflags -U_FORTIFY_SOURCE
+
+	# 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
+	filter-lto
+
+	local confargs=(
+		# 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}
+		HAVE_LIBCTF=yes
+		HAVE_LIBSYSTEMD=$(usex systemd)
+		HAVE_BPFV3=yes
+	)
+
+	edo ./configure "${confargs[@]}"
+}
+
+src_compile() {
+	emake verbose=1 $(usev !install-tests TRIGGERS='')
+}
+
+src_test() {
+	# Needs root and is also very time-consuming
+	:;
+}
+
+src_install() {
+	emake DESTDIR="${D}" install $(usev install-tests install-test)
+
+	# Stripping the BPF libs breaks them
+	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
+
+	# TODO: Restart it on upgrade? (it will carry across its own persistent state)
+	if [[ -n ${REPLACING_VERSIONS} ]]; then
+		# TODO: Make this more intelligent wrt comparison
+		if systemd_is_booted ; then
+			einfo "Restart the DTrace 'dtprobed' service after upgrades:"
+			einfo " systemctl try-restart dtprobed"
+		else
+			einfo "Restart the DTrace 'dtprobed' service with:"
+			einfo " /etc/init.d/dtprobed restart"
+		fi
+	else
+		if systemd_is_booted ; then
+			einfo "Enable and start the DTrace 'dtprobed' service with:"
+			einfo " systemctl enable --now dtprobed"
+		else
+			einfo "Enable and start the DTrace 'dtprobed' service with:"
+			einfo " rc-update add dtprobed"
+			einfo " /etc/init.d/dtprobed start"
+		fi
+	fi
+}
+
+pkg_postrm() {
+	udev_reload
+}

diff --git a/dev-debug/dtrace/dtrace-9999.ebuild b/dev-debug/dtrace/dtrace-9999.ebuild
new file mode 100644
index 000000000000..7c697bf009cf
--- /dev/null
+++ b/dev-debug/dtrace/dtrace-9999.ebuild
@@ -0,0 +1,176 @@
+# Copyright 2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit edo flag-o-matic linux-info systemd toolchain-funcs udev
+
+DESCRIPTION="Dynamic systemwide tracing tool"
+HOMEPAGE="https://github.com/oracle/dtrace-utils"
+
+if [[ ${PV} == 9999 ]]; then
+	EGIT_BRANCH="devel"
+	EGIT_REPO_URI="https://github.com/oracle/dtrace-utils"
+	inherit git-r3
+else
+	SRC_URI="https://github.com/oracle/dtrace-utils/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz"
+	S="${WORKDIR}"/dtrace-utils-${PV}
+
+	KEYWORDS="-* ~amd64"
+fi
+
+LICENSE="UPL-1.0"
+SLOT="0"
+IUSE="install-tests systemd"
+
+# XXX: right now, we auto-adapt to whether multilibs are present:
+# should we force them to be? how?
+#
+# XXX: binutils-libs will need an extra patch for what dtrace does with
+# it in the absence of in-kernel CTF: it will be backported
+# to 2.42, but perhaps a patch would be a good idea before that?
+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:=
+	sys-libs/zlib
+	systemd? ( sys-apps/systemd )
+"
+RDEPEND="
+	${DEPEND}
+	!dev-debug/systemtap
+	net-analyzer/wireshark
+	install-tests? (
+		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
+		virtual/perl-IO-Socket-IP
+	)
+"
+BDEPEND="
+	dev-build/make
+	>=sys-devel/bpf-toolchain-14.1.0
+	sys-apps/gawk
+	sys-devel/bison
+	sys-devel/flex
+"
+
+pkg_pretend() {
+	# TODO: optional kernel patches
+
+	# Basics for debugging information, BPF
+	local CONFIG_CHECK="~BPF ~DEBUG_INFO_BTF ~KALLSYMS_ALL ~CUSE"
+
+	# Tracing
+	# TODO: CONFIG_HAVE_SYSCALL_TRACEPOINTS - is it auto?
+	# TODO: CONFIG_UPROBE_EVENTS maybe?
+	CONFIG_CHECK+=" ~FTRACE_SYSCALLS ~UPROBE_EVENTS ~DYNAMIC_FTRACE ~FUNCTION_TRACER"
+
+	# https://gcc.gnu.org/PR84052
+	CONFIG_CHECK+=" !GCC_PLUGIN_RANDSTRUCT"
+
+	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
+
+	# TODO: Can drop once https://lore.kernel.org/dtrace/20240425164057.420580-1-nick.alcock@oracle.com/ is in
+	# XXX: That wasn't enough, need to report upstream the other issues during build
+	tc-enables-fortify-source && append-cppflags -U_FORTIFY_SOURCE
+
+	# 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
+	filter-lto
+
+	local confargs=(
+		# 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}
+		HAVE_LIBCTF=yes
+		HAVE_LIBSYSTEMD=$(usex systemd)
+		HAVE_BPFV3=yes
+	)
+
+	edo ./configure "${confargs[@]}"
+}
+
+src_compile() {
+	emake verbose=1 $(usev !install-tests TRIGGERS='')
+}
+
+src_test() {
+	# Needs root and is also very time-consuming
+	:;
+}
+
+src_install() {
+	emake DESTDIR="${D}" install $(usev install-tests install-test)
+
+	# Stripping the BPF libs breaks them
+	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
+
+	# TODO: Restart it on upgrade? (it will carry across its own persistent state)
+	if [[ -n ${REPLACING_VERSIONS} ]]; then
+		# TODO: Make this more intelligent wrt comparison
+		if systemd_is_booted ; then
+			einfo "Restart the DTrace 'dtprobed' service after upgrades:"
+			einfo " systemctl try-restart dtprobed"
+		else
+			einfo "Restart the DTrace 'dtprobed' service with:"
+			einfo " /etc/init.d/dtprobed restart"
+		fi
+	else
+		if systemd_is_booted ; then
+			einfo "Enable and start the DTrace 'dtprobed' service with:"
+			einfo " systemctl enable --now dtprobed"
+		else
+			einfo "Enable and start the DTrace 'dtprobed' service with:"
+			einfo " rc-update add dtprobed"
+			einfo " /etc/init.d/dtprobed start"
+		fi
+	fi
+}
+
+pkg_postrm() {
+	udev_reload
+}

diff --git a/dev-debug/dtrace/files/dtprobed.init b/dev-debug/dtrace/files/dtprobed.init
new file mode 100644
index 000000000000..b3d039671e2f
--- /dev/null
+++ b/dev-debug/dtrace/files/dtprobed.init
@@ -0,0 +1,15 @@
+#!/sbin/openrc-run
+
+depend() {
+	need localmount
+	need bootmisc
+	after logger
+}
+
+start() {
+	start-stop-daemon --start --exec /usr/sbin/dtprobed
+}
+
+stop() {
+	start-stop-daemon --stop --exec /usr/sbin/dtprobed
+}

diff --git a/dev-debug/dtrace/metadata.xml b/dev-debug/dtrace/metadata.xml
new file mode 100644
index 000000000000..00989594025b
--- /dev/null
+++ b/dev-debug/dtrace/metadata.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>sam@gentoo.org</email>
+		<name>Sam James</name>
+	</maintainer>
+	<maintainer type="person">
+		<email>arsen@gentoo.org</email>
+		<description>Arsen Arsenović</description>
+	</maintainer>
+	<use>
+		<flag name="install-tests">
+			Install the testsuite for manual use. It is not suitable
+			for automatic execution within the ebuild because it
+			requires root privlieges.
+		</flag>
+	</use>
+	<upstream>
+		<remote-id type="github">oracle/dtrace-utils</remote-id>
+	</upstream>
+</pkgmetadata>


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2024-08-18 21:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-18 21:34 [gentoo-commits] repo/gentoo:master commit in: dev-debug/dtrace/, dev-debug/dtrace/files/ Sam James

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox