2017-11-25 18 views
1

OSXでNixパッケージマネージャを使用し始めましたが、passバイナリ(https://www.passwordstore.org)の最初のパッケージを作成しようとしています。これはNixpkgsリポジトリでは利用できません。Nixパッケージのランタイム依存関係を指定する

ランタイム依存関係(getopt)を指定しようとしていますが、バイナリを使用している場合は表示されません。

{ 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; 
       }; 
     }; 
} 

私は正常にこのパッケージ(nix-build --show-trace)を構築し、それをインストールすることができます(nix-env -i ./result):

は、これは私のパッケージのdefault.nixです。私のパッケージの実行時の依存関係をリスト

getoptが記載されている例を示します

nix-store -qR $(which pass) 

... 
/nix/store/c5swmygzc0kmvpq6cfkvwm2yz1k57kqy-getopt-1.1.4 

私はバイナリ(pass init my-key)を使用して来るときしかし、私は次のエラーを取得する:

/nix/store/...-pass-1.7.1/artifact/bin/pass: line 302: 
/usr/local/bin/getopt: No such file or directory 

誰が何を助言することができ私は間違っている?

おかげ

+0

を参照して、ソースコードにパッチを適用するために

openbsd.shに似ている)GETOPT=getoptな限りシンプルにすることができます。それらにパッチを当てる必要があるかもしれません。 –

+0

生態系の他の部分では、/artifact/binではなく、/binにバイナリがあると想定されるため、おそらく.../artifactを省略する必要があります。 (おそらくあなたの問題の原因ではない) –

+1

楽しい事実:あなたはURLを引用符で囲むことができます。 –

答えて

0

getoptは特別扱いになります。 darwin.shスクリプトでは、brewportを使用して検索し、/usr/localに戻ります。そのため、(正しい)ラッパーは効果がありません。

解決策は、getoptPATHに表示するように見えますが、これはラッパースクリプトによって提供されています。おそらく、パスワード、店内にはいくつかのパスをハードコードのように思えNixPkgs documentation

+0

Robertさん、お勧めの通り 'GETOPT = getopt'置換を適用して' src/platform/darwin.sh'にパッチを当てました。完全に動作します。あなたの助けをありがとう! – b73

0

nix-buildを実行した後、あなたはあなたのラッパースクリプトを見て、それがOKに見えることを確認するcat result/bin/passを実行する必要があります。これは、getoptを含むようにPATHを設定し、result/artifact/bin/passを呼び出すシェルスクリプトでなければなりません。

次に、ラッパースクリプトを実行してみます。ラッパーはresult/binで、result/artifact/binではないことに注意してください。

+0

Davidさん、ありがとうございます。ラッパーが 'result/bin'になるように私のパッケージを修正しました。 'export/PATH ="/nix/store /..- getopt-1.1.4/bin "'を実行し、 'exec -a" $ 0 ""/nix/store/... - pass-1.7.1/bin/.pass-wrapped "" $ {extraFlagsArray [@]} "" $ @ "。 ラッパースクリプトを実行すると、インストールされた 'pass'バイナリを実行したときと同じエラーが表示されます: '/usr/local/bin/getopt:そのようなファイルやディレクトリはありません ' – b73

+1

OK、もう一つそのプログラムをパッチするだけで、 'getopt'がPATH上にあるかどうかを呼び出すことができます。あるいは、' getopt'をNixストアからフルパスで呼び出すことができます。 '/ usr'を調べてはいけません。これはNixの純粋さの目標に反しているからです。 –

+0

デビッドに感謝します。ロバートのコメントに記載されているように、私は「パス」にパッチを当てました。すべて働いている。手伝ってくれてありがとう! – b73

関連する問題