diff options
author | 2024-05-06 18:30:16 +0100 | |
---|---|---|
committer | 2024-08-18 22:28:19 +0100 | |
commit | de83d17702a7f6b8a14264e2662f4819547040fd (patch) | |
tree | a69d3aef7e5671b4898c7017463f6bdff025600a | |
parent | app-emacs/php-mode: keyword 1.25.1 for ~riscv (diff) | |
download | gentoo-de83d17702a7f6b8a14264e2662f4819547040fd.tar.gz gentoo-de83d17702a7f6b8a14264e2662f4819547040fd.tar.bz2 gentoo-de83d17702a7f6b8a14264e2662f4819547040fd.zip |
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@gentoo.org>
-rw-r--r-- | dev-debug/dtrace/Manifest | 1 | ||||
-rw-r--r-- | dev-debug/dtrace/dtrace-2.0.1.1.ebuild | 176 | ||||
-rw-r--r-- | dev-debug/dtrace/dtrace-9999.ebuild | 176 | ||||
-rw-r--r-- | dev-debug/dtrace/files/dtprobed.init | 15 | ||||
-rw-r--r-- | dev-debug/dtrace/metadata.xml | 22 |
5 files changed, 390 insertions, 0 deletions
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> |