From f023b62085bf8a1f00092163f827b9dd28b87519 Mon Sep 17 00:00:00 2001 From: John Soo Date: Sat, 13 Jun 2020 23:16:11 -0700 Subject: [PATCH 3/4] gnu: Add bcc. * gnu/packages/linux.scm (bcc): New variable. --- gnu/packages/linux.scm | 85 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 94d3b37845..b3922b0770 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -98,6 +98,8 @@ #:use-module (gnu packages haskell-xyz) #:use-module (gnu packages libunwind) #:use-module (gnu packages libusb) + #:use-module (gnu packages llvm) + #:use-module (gnu packages lua) #:use-module (gnu packages man) #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) @@ -132,6 +134,7 @@ #:use-module (gnu packages rsync) #:use-module (gnu packages selinux) #:use-module (gnu packages swig) + #:use-module (gnu packages version-control) #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) #:use-module (guix build-system go) @@ -7229,3 +7232,85 @@ persistent over reboots.") contrast to BCC, do not require the Clang/LLVM runtime or linux kernel headers.") (license `(,license:lgpl2.1 ,license:bsd-2)))) + +(define-public bcc + (package + (name "bcc") + (version "0.15.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/iovisor/bcc") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1d5j9zanffa1c7lpi5fcrdlx1n7hy86xl82fam2xqr0s41q4ipxw")))) + (build-system cmake-build-system) + (native-inputs + `(("bison" ,bison) + ("flex" ,flex))) + (inputs + `(;; TODO: package optional integrations + ;; ("arping" ,argping) + ;; ("netperf" ,netperf) + ;; ("iperf" ,iperf) or ("iperf3" ,iperf3) + ("clang-toolchain" ,clang-toolchain) + ("libbpf" ,(package-source libbpf)) + ;; LibElf required but libelf does not contain + ;; archives, only object files. + ;; https://github.com/iovisor/bcc/issues/504 + ("elfutils" ,elfutils) + ("linux-libre-headers" ,linux-libre-headers) + ("luajit" ,luajit) + ("python-wrapper" ,python-wrapper))) + (arguments + `(;; Tests all require sudo and a "standard" file heirarchy + #:tests? #f + #:configure-flags + (let ((revision ,version)) + `(,(string-append "-DREVISION=" revision))) + #:phases + (modify-phases %standard-phases + ;; FIXME: "-DCMAKE_USE_LIBBPF_PACKAGE=ON" + ;; Does not make bcc use libbpf from system + (add-after 'unpack 'copy-libbpf + (lambda* (#:key inputs #:allow-other-keys) + (delete-file-recursively "src/cc/libbpf") + (copy-recursively + (assoc-ref inputs "libbpf") "src/cc/libbpf"))) + (add-after 'copy-libbpf 'substitute-libbc + (lambda* (#:key outputs #:allow-other-keys) + (substitute* "src/python/bcc/libbcc.py" + (("(libbcc\\.so.*)\\b" _ libbcc) + (string-append + (assoc-ref outputs "out") "/lib/" libbcc))))) + (add-after 'install 'wrap-tools + (lambda* (#:key outputs #:allow-other-keys) + (use-modules (ice-9 textual-ports)) + (let* ((out (assoc-ref outputs "out")) + (lib (string-append out "/lib")) + (tools (string-append out "/share/bcc/tools")) + (python-executable? + (lambda (filename _) + (call-with-input-file filename + (lambda (port) + (string-contains (get-line port) "/bin/python")))))) + (for-each + (lambda (python-executable) + (format #t "wrapping: ~A~%" python-executable) + (wrap-program python-executable + `("PYTHONPATH" ":" prefix + (,(string-append lib "/python3.8/site-packages"))))) + (find-files tools python-executable?)) + #t)))))) + (home-page "https://github.com/iovisor/bcc") + (synopsis "Tools for BPF on Linux") + (description + "BCC is a toolkit for creating efficient kernel tracing and +manipulation programs, and includes several useful tools and examples. It +makes use of extended BPF (Berkeley Packet Filters), formally known as eBPF, a +new feature that was first added to Linux 3.15. Much of what BCC uses requires +Linux 4.1 and above.") + (license license:asl2.0))) -- 2.27.0