diff --git a/default.nix b/default.nix index 079f7db..2a91a4e 100644 --- a/default.nix +++ b/default.nix @@ -77,7 +77,7 @@ in // ( if pkgs.system == "riscv64-linux" then { - inherit (pkgsWithOverlay) vf2Kernel; + inherit (pkgsWithOverlay) vf2Kernel valgrind; } else {} ) diff --git a/flake.nix b/flake.nix index da49f2c..e8e9001 100644 --- a/flake.nix +++ b/flake.nix @@ -121,7 +121,7 @@ // ( if system == "riscv64-linux" then { - inherit (pkgs) vf2Kernel; + inherit (pkgs) vf2Kernel valgrind; } else {} ) diff --git a/overlay.nix b/overlay.nix index 03039ea..7133ba3 100644 --- a/overlay.nix +++ b/overlay.nix @@ -42,6 +42,7 @@ system: self: super: let doCheck = false; doInstallCheck = false; }); + valgrind = self.callPackage ./riscv/valgrind {}; }) else (_: _: {}); diff --git a/riscv/valgrind/default.nix b/riscv/valgrind/default.nix new file mode 100644 index 0000000..5c372c5 --- /dev/null +++ b/riscv/valgrind/default.nix @@ -0,0 +1,115 @@ +{ + lib, + stdenv, + fetchFromGitHub, + perl, + gdb, + cctools, + xnu, + bootstrap_cmds, + autoreconfHook, +}: let + source = builtins.fromJSON (builtins.readFile ./source.json); +in + stdenv.mkDerivation rec { + pname = "valgrind-riscv64"; + version = source.date; + + src = fetchFromGitHub { + owner = "petrpavlu"; + repo = "valgrind-riscv64"; + inherit (source) rev sha256; + }; + + outputs = ["out" "dev"]; + + hardeningDisable = ["stackprotector"]; + + # GDB is needed to provide a sane default for `--db-command'. + # Perl is needed for `callgrind_{annotate,control}'. + buildInputs = [gdb perl] ++ lib.optionals (stdenv.isDarwin) [bootstrap_cmds xnu]; + + # Perl is also a native build input. + nativeBuildInputs = [autoreconfHook perl]; + + enableParallelBuilding = true; + separateDebugInfo = stdenv.isLinux; + + preConfigure = lib.optionalString stdenv.isDarwin ( + let + OSRELEASE = '' + $(awk -F '"' '/#define OSRELEASE/{ print $2 }' \ + <${xnu}/Library/Frameworks/Kernel.framework/Headers/libkern/version.h)''; + in '' + echo "Don't derive our xnu version using uname -r." + substituteInPlace configure --replace "uname -r" "echo ${OSRELEASE}" + + # Apple's GCC doesn't recognize `-arch' (as of version 4.2.1, build 5666). + echo "getting rid of the \`-arch' GCC option..." + find -name Makefile\* -exec \ + sed -i {} -e's/DARWIN\(.*\)-arch [^ ]\+/DARWIN\1/g' \; + + sed -i coregrind/link_tool_exe_darwin.in \ + -e 's/^my \$archstr = .*/my $archstr = "x86_64";/g' + + substituteInPlace coregrind/m_debuginfo/readmacho.c \ + --replace /usr/bin/dsymutil ${stdenv.cc.bintools.bintools}/bin/dsymutil + + echo "substitute hardcoded /usr/bin/ld with ${cctools}/bin/ld" + substituteInPlace coregrind/link_tool_exe_darwin.in \ + --replace /usr/bin/ld ${cctools}/bin/ld + '' + ); + + # To prevent rebuild on linux when moving darwin's postPatch fixes to preConfigure + postPatch = ""; + + configureFlags = + lib.optional (stdenv.hostPlatform.system == "x86_64-linux" || stdenv.hostPlatform.system == "x86_64-darwin") "--enable-only64bit" + ++ lib.optional stdenv.hostPlatform.isDarwin "--with-xcodedir=${xnu}/include"; + + doCheck = true; + + postInstall = '' + for i in $out/libexec/valgrind/*.supp; do + substituteInPlace $i \ + --replace 'obj:/lib' 'obj:*/lib' \ + --replace 'obj:/usr/X11R6/lib' 'obj:*/lib' \ + --replace 'obj:/usr/lib' 'obj:*/lib' + done + ''; + + passthru.updateScript = [ + ../../scripts/update-git.sh + "https://github.com/petrpavlu/valgrind-riscv64" + "riscv/valgrind/source.json" + ]; + + meta = { + homepage = "http://www.valgrind.org/"; + description = "Debugging and profiling tool suite"; + + longDescription = '' + Valgrind is an award-winning instrumentation framework for + building dynamic analysis tools. There are Valgrind tools that + can automatically detect many memory management and threading + bugs, and profile your programs in detail. You can also use + Valgrind to build new tools. + ''; + + license = lib.licenses.gpl2Plus; + + maintainers = [lib.maintainers.nickcao]; + platforms = lib.platforms.unix; + badPlatforms = [ + "armv5tel-linux" + "armv6l-linux" + "armv6m-linux" + "sparc-linux" + "sparc64-linux" + "riscv32-linux" + "alpha-linux" + ]; + broken = stdenv.isDarwin || stdenv.hostPlatform.isStatic; # https://hydra.nixos.org/build/128521440/nixlog/2 + }; + } diff --git a/riscv/valgrind/source.json b/riscv/valgrind/source.json new file mode 100644 index 0000000..bfc9dd9 --- /dev/null +++ b/riscv/valgrind/source.json @@ -0,0 +1,11 @@ +{ + "url": "https://github.com/petrpavlu/valgrind-riscv64", + "rev": "71272b252977fe52f03ea4fa8306b457b098cca5", + "date": "2023-04-10T20:43:50+02:00", + "path": "/nix/store/g00qg2qhm10c0a6v5v7al89pc57b4bjy-valgrind-riscv64", + "sha256": "0znk98hypdh7j84h237131aqsczz91mrwpwkvy1xgaxkhiskhgy4", + "fetchLFS": false, + "fetchSubmodules": false, + "deepClone": false, + "leaveDotGit": false +}