{
  lib,
  stdenv,
  fetchFromGitHub,
  fetchpatch,
  buildPackages,
  pkg-config,
  meson,
  ninja,
  libusb-compat-0_1,
  readline,
  libewf,
  perl,
  zlib,
  openssl,
  libuv,
  file,
  libzip,
  xxHash,
  gtk2,
  vte,
  gtkdialog,
  python3,
  ruby,
  lua,
  lz4,
  capstone,
  useX11 ? false,
  rubyBindings ? false,
  luaBindings ? false,
}:

let
  # FIXME: Compare revision with
  # https://github.com/radareorg/radare2/blob/master/libr/arch/p/arm/v35/Makefile#L26-L27
  arm64 = fetchFromGitHub {
    owner = "radareorg";
    repo = "vector35-arch-arm64";
    rev = "55d73c6bbb94448a5c615933179e73ac618cf876";
    hash = "sha256-pZxxp5xDg8mgkGEx7LaBSoKxNPyggFYA4um9YaO20LU=";
  };
  armv7 = fetchFromGitHub {
    owner = "radareorg";
    repo = "vector35-arch-armv7";
    rev = "f270a6cc99644cb8e76055b6fa632b25abd26024";
    hash = "sha256-YhfgJ7M8ys53jh1clOzj0I2yfJshXQm5zP0L9kMYsmk=";
  };
in
stdenv.mkDerivation rec {
  pname = "radare2";
  version = "5.8.4";

  src = fetchFromGitHub {
    owner = "radare";
    repo = "radare2";
    rev = "refs/tags/${version}";
    hash = "sha256-Fbluq3Q/BgPwTVNKW28FJL+Ok46hDiBjwFt6KwN4anc=";
  };

  preBuild = ''
    pushd ../libr/arch/p/arm/v35
    cp -r ${arm64} arch-arm64
    chmod -R +w arch-arm64

    cp -r ${armv7} arch-armv7
    chmod -R +w arch-armv7
    popd
  '';

  postFixup = lib.optionalString stdenv.isDarwin ''
    install_name_tool -add_rpath $out/lib $out/lib/libr_io.${version}.dylib
  '';

  mesonFlags = [
    "-Duse_sys_capstone=true"
    "-Duse_sys_magic=true"
    "-Duse_sys_zip=true"
    "-Duse_sys_xxhash=true"
    "-Duse_sys_lz4=true"
    "-Dr2_gittap=${version}"
  ];

  enableParallelBuilding = true;
  depsBuildBuild = [ buildPackages.stdenv.cc ];

  strictDeps = true;

  nativeBuildInputs = [
    pkg-config
    meson
    ninja
    python3
  ];
  buildInputs =
    [
      capstone
      file
      readline
      libusb-compat-0_1
      libewf
      perl
      zlib
      openssl
      libuv
      lz4
    ]
    ++ lib.optionals useX11 [
      gtkdialog
      vte
      gtk2
    ]
    ++ lib.optionals rubyBindings [ ruby ]
    ++ lib.optionals luaBindings [ lua ];

  propagatedBuildInputs = [
    # radare2 exposes r_lib which depends on these libraries
    file # for its list of magic numbers (`libmagic`)
    libzip
    xxHash
  ];

  meta = with lib; {
    description = "UNIX-like reverse engineering framework and command-line tools";
    homepage = "https://radare.org";
    changelog = "https://github.com/radareorg/radare2/releases/tag/${version}";
    license = licenses.gpl2Plus;
    maintainers = with maintainers; [
      azahi
      raskin
      makefu
      mic92
      arkivm
    ];
    platforms = platforms.unix;
  };
}