问题
I've just started using the Nix package manager on OSX and I'm attempting to create my first package for the pass
binary (https://www.passwordstore.org) - which is not available in the Nixpkgs repository.
I'm attempting to specify a runtime dependency (getopt
), however this doesn't appear to be available when the binary is used.
This is my packages's default.nix:
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
version = "1.7.1";
in {
pass = stdenv.mkDerivation rec {
name = "pass-${version}";
src = fetchurl {
url = "https://git.zx2c4.com/password-store/snapshot/password-store-1.7.1.tar.xz";
sha256 = "0scqkpll2q8jhzcgcsh9kqz0gwdpvynivqjmmbzax2irjfaiklpn";
};
buildInputs = [ stdenv makeWrapper];
installPhase = ''
make install PREFIX=$out/artifact
makeWrapper $out/artifact/bin/pass $out/bin/pass \
--set PATH ${stdenv.lib.makeBinPath [ getopt ]}
'';
meta = {
homepage = "https://www.passwordstore.org";
description = "The standard unix password manager";
license = stdenv.lib.licenses.gpl2Plus;
};
};
}
I can successfully build this package (nix-build --show-trace
) and install it (nix-env -i ./result
).
Listing the runtime dependencies for my package shows getopt
listed:
nix-store -qR $(which pass)
...
/nix/store/c5swmygzc0kmvpq6cfkvwm2yz1k57kqy-getopt-1.1.4
However when I come to use the binary (pass init my-key
) I get the following error:
/nix/store/...-pass-1.7.1/artifact/bin/pass: line 302:
/usr/local/bin/getopt: No such file or directory
Can anyone advise what I'm doing wrong?
Thanks
回答1:
It looks like getopt
gets a special treatment. The darwin.sh script looks for it using brew
and port
and falls back to /usr/local
. That's why the (correct) wrapper has no effect.
So the solution seems to be, to make it look for getopt
in PATH
, which is provided by the wrapper script. You can probably make it as simple as GETOPT=getopt
(which is similar to openbsd.sh
)
For patching source code, see the NixPkgs documentation
回答2:
After running nix-build
, you should run cat result/bin/pass
to look at your wrapper script and make sure it looks OK. It should be a shell script that sets the PATH to include getopt and then calls result/artifact/bin/pass
.
Then try running the wrapper script. Note that the wrapper should be in result/bin
, not result/artifact/bin
.
来源:https://stackoverflow.com/questions/47486270/specifying-nix-package-runtime-dependencies