diff --git a/pkgs/development/tools/analysis/radare2/default.nix b/pkgs/development/tools/analysis/radare2/default.nix index 5ddb03d318f9..bc5f41bf86ec 100644 --- a/pkgs/development/tools/analysis/radare2/default.nix +++ b/pkgs/development/tools/analysis/radare2/default.nix @@ -1,4 +1,6 @@ -{stdenv, fetchFromGitHub, pkgconfig, libusb, readline, libewf, perl, zlib, openssl +{stdenv, fetchFromGitHub +, ninja, meson , pkgconfig +, libusb, readline, libewf, perl, zlib, openssl , gtk2 ? null, vte ? null, gtkdialog ? null , python ? null , ruby ? null @@ -10,40 +12,57 @@ assert useX11 -> (gtk2 != null && vte != null && gtkdialog != null); assert rubyBindings -> ruby != null; assert pythonBindings -> python != null; + let inherit (stdenv.lib) optional; + # + # DO NOT EDIT! Automatically generated by ./update.py + version_commit = "18177"; + gittap = "2.6.0"; + gittip = "83ef480221ec29d82c16003c61d0dc86b8851d38"; + version = "2.6.0"; + sha256 = "18jhb9w8c1m09383d2xm2qp0rc240psjygbbs222hzpx32hald5s"; + cs_tip = "37569a6874c8547b349a80823adda9284499fe80"; + cs_sha256 = "0v31367g4jn4baswl62y0rvvm2nf57y91n3731xqblvi6qxj8qkv"; + # in stdenv.mkDerivation rec { - version = "2.5.0"; name = "radare2-${version}"; src = fetchFromGitHub { owner = "radare"; repo = "radare2"; rev = version; - sha256 = "07x94chkhpn3wgw4pypn35psxq370j6xwmhf1mh5z27cqkq7c2yd"; + inherit sha256; }; - # do not try to update capstone - WITHOUT_PULL=1; - postPatch = let - cs_tip = "4a1b580d069c82d60070d0869a87000db7cdabe2"; # version from $sourceRoot/shlr/Makefile capstone = fetchFromGitHub { owner = "aquynh"; repo = "capstone"; + # version from $sourceRoot/shlr/Makefile rev = cs_tip; - sha256 = "0v6rxfpxjq0hf40qn1n5m5wsv1dv6p1j8vm94a708lhvcbk9nkv8"; + sha256 = cs_sha256; }; in '' if ! grep -F "CS_TIP=${cs_tip}" shlr/Makefile; then echo "CS_TIP mismatch"; exit 1; fi - cp -r ${capstone} shlr/capstone - chmod -R u+rw shlr/capstone + ln -s ${capstone} shlr/capstone ''; + postInstall = '' + ln -s $out/bin/radare2 $out/bin/r2 + install -D -m755 $src/binr/r2pm/r2pm $out/bin/r2pm + ''; + + mesonFlags = [ + "-Dr2_version_commit=${version_commit}" + "-Dr2_gittap=${gittap}" + "-Dr2_gittip=${gittip}" + ]; + enableParallelBuilding = true; - nativeBuildInputs = [ pkgconfig ]; + nativeBuildInputs = [ pkgconfig ninja meson ]; buildInputs = [ readline libusb libewf perl zlib openssl] ++ optional useX11 [gtkdialog vte gtk2] ++ optional rubyBindings [ruby] diff --git a/pkgs/development/tools/analysis/radare2/update.py b/pkgs/development/tools/analysis/radare2/update.py new file mode 100755 index 000000000000..1f16a00905c1 --- /dev/null +++ b/pkgs/development/tools/analysis/radare2/update.py @@ -0,0 +1,72 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p nix -p python3 -p git -i python +# USAGE - just run the script: ./update.py +# When editing this file, make also sure it passes the mypy typecheck +# and is formatted with yapf. +import urllib.request +import json +import tempfile +import subprocess +import fileinput +import re +from pathlib import Path + + +def sh(*args: str) -> str: + out = subprocess.check_output(list(args)) + return out.strip().decode("utf-8") + + +def prefetch_github(owner: str, repo: str, ref: str) -> str: + return sh("nix-prefetch-url", "--unpack", + f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz") + + +def main() -> None: + url = "https://api.github.com/repos/radare/radare2/releases/latest" + with urllib.request.urlopen(url) as response: + release = json.load(response) # type: ignore + version = release["tag_name"] + with tempfile.TemporaryDirectory() as dirname: + + def git(*args: str) -> str: + return sh("git", "-C", dirname, *args) + + git("clone", "--branch", version, "https://github.com/radare/radare2", + ".") + sha256 = prefetch_github("radare", "radare2", version) + nix_file = str(Path(__file__).parent.joinpath("default.nix")) + + cs_tip = None + with open(Path(dirname).joinpath("shlr", "Makefile")) as makefile: + for l in makefile: + match = re.match("CS_TIP=(\S+)", l) + if match: + cs_tip = match.group(1) + assert cs_tip is not None + + cs_sha256 = prefetch_github("aquynh", "capstone", cs_tip) + + in_block = False + with fileinput.FileInput(nix_file, inplace=True) as f: + for l in f: + if "#" in l: + in_block = True + print(f""" # + # DO NOT EDIT! Automatically generated by ./update.py + version_commit = "{git("rev-list", "--all", "--count")}"; + gittap = "{git("describe", "--tags", "--match", "[0-9]*")}"; + gittip = "{git("rev-parse", "HEAD")}"; + version = "{version}"; + sha256 = "{sha256}"; + cs_tip = "{cs_tip}"; + cs_sha256 = "{cs_sha256}"; + #""") + elif "#" in l: + in_block = False + elif not in_block: + print(l, end="") + + +if __name__ == "__main__": + main()