Specifying Nix package runtime dependencies

▼魔方 西西 提交于 2019-12-11 02:29:00

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!