これが私のdefault.nixです。
with import <nixpkgs> {}; {
cimgEnv = stdenv.mkDerivation {
name = "cimgdev";
buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost jdk gradle (opencv4.override { enableGtk2 = true; })];
};
environment.variables = rec {
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/nix/store/j71chi4b06bh8rpd5611d6q8asrwf9z6-opencv-4.7.0/lib/";
};
}
しかし、nix-shellの後にecho $ LD_LIBRARY_PATHを実行しました。
私は何も得ず、空の文字列だけを取得します。
挨拶
答え1
おそらくあなたが望むものは次のとおりですdefault.nix
。
let
pkgs = import <nixpkgs> {};
opencv4 = pkgs.opencv4.override {enableGtk2 = true;};
in
pkgs.stdenv.mkDerivation {
name = "cimgdev";
buildInputs = with pkgs; [pkgconfig stdenv cimg xorg.libX11 boost jdk gradle opencv4];
shellHook = ''
export LD_LIBRARY_PATH="${opencv4}/lib:$LD_LIBRARY_PATH"
'';
}
知りたいならなぜこれは機能しますが、コードは機能しません。読んでください。
Nixのフォークは、本質的にNixにパッケージの構築方法を伝える一連のガイドラインにすぎません。フォークは、名前、ビルドプロセス中に実行するビルダー、ビルドできるシステムで構成されています。また、ビルダーに環境変数として渡される他の属性を含めることもできます。
nix-shell
フォーク(indefault.nix
またはshell.nix
)を入力として受け入れ、Builder呼び出しと同じ方法で対話型シェルを実行するので、すべてのプロパティが環境変数として公開されます。shellHook
また、実行する前にシェルからコマンドを読み込んで実行します。
LD_LIBRARY_PATH
aなしで直接設定できないのは、shellHook
古い値を追加するのではなく上書きするためです。
opencv4
また、リポジトリパスを直接参照する代わりに(オーバーライドを使用して)その中のパッケージを参照するようにコードを変更しましたLD_LIBRARY_PATH
。なぜなら、あなたのアプローチを使用すると、パッケージ(またはその依存関係の1つ)が更新されると中断される可能性があります。