nixpkgs/pkgs/tools/misc/fzf/default.nix
Donghang Lin 794f6f1f25 fzf: build with CGO_ENABLED=0
Since 0.36.0, fzf introduced several go libs that bring CGO dependencies if CGO is enabled.
This makes the final binary depend on several non deterministic glibc share libraries.
Fix with CGO_ENABLED=0 to make the final binary static.
2023-06-01 11:39:47 -07:00

111 lines
3.0 KiB
Nix

{ stdenv
, lib
, buildGoModule
, fetchFromGitHub
, writeShellScriptBin
, runtimeShell
, installShellFiles
, ncurses
, perl
, glibcLocales
, testers
, fzf
, fetchpatch
}:
let
# on Linux, wrap perl in the bash completion scripts with the glibc locales,
# so that using the shell completion (ctrl+r, etc) doesn't result in ugly
# warnings on non-nixos machines
ourPerl = if !stdenv.isLinux then perl else (
writeShellScriptBin "perl" ''
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
exec ${perl}/bin/perl "$@"
'');
in
buildGoModule rec {
pname = "fzf";
version = "0.41.1";
src = fetchFromGitHub {
owner = "junegunn";
repo = pname;
rev = version;
hash = "sha256-YnWc+yStyoZoCKxEMhQC6Z4FZ/OVRaVsAJPtAzGiJVk=";
};
patches = [
(fetchpatch {
name = "update-test-case.patch";
url = "https://github.com/junegunn/fzf/commit/448d7e0c5a717128d499f6a09a978b7addd1d925.patch";
hash = "sha256-54UYW8x78ZcjPwDWmGLVLxw2E910wme2TkBN7YAr1L8=";
})
];
vendorHash = "sha256-O6OjBbrVAxDQd27ar2mmFkU1XyVM2C8SJWJ54rgaf2s=";
CGO_ENABLED = 0;
outputs = [ "out" "man" ];
nativeBuildInputs = [ installShellFiles ];
buildInputs = [ ncurses ];
ldflags = [
"-s" "-w" "-X main.version=${version} -X main.revision=${src.rev}"
];
# The vim plugin expects a relative path to the binary; patch it to abspath.
postPatch = ''
sed -i -e "s|expand('<sfile>:h:h')|'$out'|" plugin/fzf.vim
if ! grep -q $out plugin/fzf.vim; then
echo "Failed to replace vim base_dir path with $out"
exit 1
fi
# Has a sneaky dependency on perl
# Include first args to make sure we're patching the right thing
substituteInPlace shell/key-bindings.bash \
--replace " perl -n " " ${ourPerl}/bin/perl -n "
'';
postInstall = ''
install bin/fzf-tmux $out/bin
installManPage man/man1/fzf.1 man/man1/fzf-tmux.1
install -D plugin/* -t $out/share/vim-plugins/${pname}/plugin
mkdir -p $out/share/nvim
ln -s $out/share/vim-plugins/${pname} $out/share/nvim/site
# Install shell integrations
install -D shell/* -t $out/share/fzf/
install -D shell/key-bindings.fish $out/share/fish/vendor_functions.d/fzf_key_bindings.fish
mkdir -p $out/share/fish/vendor_conf.d
echo fzf_key_bindings > $out/share/fish/vendor_conf.d/load-fzf-key-bindings.fish
cat <<SCRIPT > $out/bin/fzf-share
#!${runtimeShell}
# Run this script to find the fzf shared folder where all the shell
# integration scripts are living.
echo $out/share/fzf
SCRIPT
chmod +x $out/bin/fzf-share
'';
passthru.tests.version = testers.testVersion {
package = fzf;
};
meta = with lib; {
homepage = "https://github.com/junegunn/fzf";
description = "A command-line fuzzy finder written in Go";
license = licenses.mit;
maintainers = with maintainers; [ Br1ght0ne ma27 zowoq ];
platforms = platforms.unix;
changelog = "https://github.com/junegunn/fzf/blob/${version}/CHANGELOG.md";
};
}