From 085bf1f2f1516ad6e75e0de964f37883ad28ae99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Tue, 4 May 2010 13:32:09 +0000 Subject: [PATCH] Add SystemTap. svn path=/nixpkgs/trunk/; revision=21596 --- .../tools/profiling/systemtap/default.nix | 73 +++++++++++++++++++ .../systemtap/nixos-kernel-store-path.patch | 47 ++++++++++++ pkgs/top-level/all-packages.nix | 8 ++ 3 files changed, 128 insertions(+) create mode 100644 pkgs/development/tools/profiling/systemtap/default.nix create mode 100644 pkgs/development/tools/profiling/systemtap/nixos-kernel-store-path.patch diff --git a/pkgs/development/tools/profiling/systemtap/default.nix b/pkgs/development/tools/profiling/systemtap/default.nix new file mode 100644 index 00000000000..66e4870aa59 --- /dev/null +++ b/pkgs/development/tools/profiling/systemtap/default.nix @@ -0,0 +1,73 @@ +{ fetchurl, stdenv, linux, elfutils, latex2html, xmlto, docbook_xml_dtd_412 +, libxml2, docbook_xsl, libxslt, texLive, texLiveExtra, ghostscript, pkgconfig +, gtkmm, libglademm, boost, perl, sqlite }: + +stdenv.mkDerivation rec { + name = "systemtap-1.2"; + + src = fetchurl { + url = "http://sources.redhat.com/systemtap/ftp/releases/${name}.tar.gz"; + sha256 = "0kxgjr8p1pnncc0l4941gzx0jsyyqjzjqar2qkcjzp266ajn9qz6"; + }; + + patches = + stdenv.lib.optional (stdenv ? glibc) ./nixos-kernel-store-path.patch; + + postPatch = + '' sed -i scripts/kernel-doc -e 's|/usr/bin/perl|${perl}/bin/perl|g' + ''; + + preConfigure = + # XXX: This should really be handled by TeXLive's setup-hook. + '' export TEXINPUTS="${latex2html}/texinputs:$TEXINPUTS" + export TEXINPUTS="${texLiveExtra}/texmf-dist/tex/latex/preprint:$TEXINPUTS" + echo "\$TEXINPUTS is \`$TEXINPUTS'" + ''; + + postConfigure = + /* Work around this: + + StapParser.cxx:118: instantiated from here + /...-boost-1.42.0/include/boost/algorithm/string/compare.hpp:43: error: comparison between signed and unsigned integer expressions + + */ + '' sed -i "grapher/Makefile" -e's/-Werror//g' + ''; + + buildInputs = + [ elfutils latex2html xmlto texLive texLiveExtra ghostscript + pkgconfig gtkmm libglademm boost sqlite + docbook_xml_dtd_412 libxml2 + docbook_xsl libxslt + ]; + + meta = { + description = "SystemTap, tools to gather information about a running GNU/Linux system"; + + longDescription = + '' SystemTap provides free software (GPL) infrastructure to simplify + the gathering of information about the running GNU/Linux system. + This assists diagnosis of a performance or functional problem. + SystemTap eliminates the need for the developer to go through the + tedious and disruptive instrument, recompile, install, and reboot + sequence that may be otherwise required to collect data. + + SystemTap provides a simple command line interface and scripting + language for writing instrumentation for a live running kernel. We + are publishing samples, as well as enlarging the internal "tapset" + script library to aid reuse and abstraction. + + Among other tracing/probing tools, SystemTap is the tool of choice + for complex tasks that may require live analysis, programmable + on-line response, and whole-system symbolic access. SystemTap can + also handle simple tracing jobs. + ''; + + homepage = http://sourceware.org/systemtap/; + + license = "GPLv2+"; + + maintainers = [ stdenv.lib.maintainers.ludo ]; + platforms = stdenv.lib.platforms.linux; + }; +} diff --git a/pkgs/development/tools/profiling/systemtap/nixos-kernel-store-path.patch b/pkgs/development/tools/profiling/systemtap/nixos-kernel-store-path.patch new file mode 100644 index 00000000000..5881ed84533 --- /dev/null +++ b/pkgs/development/tools/profiling/systemtap/nixos-kernel-store-path.patch @@ -0,0 +1,47 @@ +This patch makes stap(1) know about the kernel store path on NixOS. + +--- systemtap-1.2/main.cxx 2010-03-22 22:51:49.000000000 +0100 ++++ systemtap-1.2/main.cxx 2010-05-04 14:56:19.000000000 +0200 +@@ -528,6 +528,32 @@ getmemusage () + return oss.str(); + } + ++/* Read `/proc/cmdline' and extract the store path. The assumption is that ++ `/proc/cmdline' looks like this: ++ ++ BOOT_IMAGE=/nix/store/sxjd69wfcr6w8jlbcc5bc20nwjliq872-linux-2.6.32.8/bzImage systemConfig=/nix/store/kiicqkjwgfvkwrg4fp3dnhwldh7dq7is-system init=/nix/store/czgncihjwx3n58xij6i1rlnz8wv6ym4j-stage-2-init.sh splash=verbose vga=0x317 ++ ++ This is the case on NixOS GNU/Linux. */ ++static string ++kernel_store_path (void) ++{ ++ ifstream proc_cmdline ("/proc/cmdline"); ++ string variable_name, store_path; ++ ++ getline (proc_cmdline, variable_name, '='); ++ if (variable_name == "BOOT_IMAGE") ++ { ++ string boot_image_path; ++ size_t slash_pos; ++ ++ getline (proc_cmdline, boot_image_path, ' '); ++ slash_pos = boot_image_path.find_last_of ('/'); ++ store_path = boot_image_path.substr (0, slash_pos); ++ } ++ ++ return store_path; ++} ++ + int + main (int argc, char * const argv []) + { +@@ -541,7 +567,8 @@ main (int argc, char * const argv []) + struct utsname buf; + (void) uname (& buf); + s.kernel_release = string (buf.release); +- s.kernel_build_tree = "/lib/modules/" + s.kernel_release + "/build"; ++ s.kernel_build_tree = ++ kernel_store_path () + "/lib/modules/" + s.kernel_release + "/build"; + + // PR4186: Copy logic from coreutils uname (uname -i) to squash + // i?86->i386. Actually, copy logic from linux top-level Makefile diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 56b5d0baa9c..7c6835965fc 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -6288,6 +6288,14 @@ let inherit (gnome) gtk glib pango libglade; }; + systemtap = import ../development/tools/profiling/systemtap { + inherit fetchurl stdenv elfutils latex2html xmlto pkgconfig boost + texLive texLiveExtra ghostscript perl docbook_xml_dtd_412 libxml2 + docbook_xsl libxslt sqlite; + linux = kernel; + inherit (gnome) gtkmm libglademm; + }; + virtualbox = import ../applications/virtualization/virtualbox { stdenv = stdenv_32bit; inherit fetchurl lib iasl dev86 libxslt libxml2 SDL hal