nix:覆盖 pybind11 中的 doCheck
nix: override doCheck in pybind11
查看:https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/pybind11/default.nix,在我看来,我应该能够避免 运行 测试(即设置 -DPYBIND11_TEST=OFF
),如下所示:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
doCheck = false;
});
然而,这不起作用。
我直接修改cmakeFlags解决了我的问题:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
cmakeFlags = [
"-DPYTHON_EXECUTABLE=${pkgs.python.interpreter}"
"-DPYBIND11_TEST=OFF"
];
});
但我想知道为什么前一种方法不起作用。
它不起作用,因为推导是使用 rec
关键字,它没有覆盖的概念。节选:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation rec { #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
}
使用 .overrideAttrs (oldAttrs: { doCheck = false; })
你只覆盖 doCheck
属性,而不是 cmakeFlags
,它仍然引用词法中的 doCheck
(#1
) rec {}
(#0
)
引入的作用域
因此以下内容等同于上面的代码段:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation (let #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
in { #0
name = name;
version = version;
doCheck = doCheck; #1
cmakeFlags = cmakeFlags;
}
mkDerivation
只能看到它得到的attrset,但不能反省和修改构建那个attrset的表达式。这是一个必要的 Nix 语言设计原则,因为它可以让您推理代码并实现惰性。 rec
语义根本不适合覆盖。
查看:https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/pybind11/default.nix,在我看来,我应该能够避免 运行 测试(即设置 -DPYBIND11_TEST=OFF
),如下所示:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
doCheck = false;
});
然而,这不起作用。
我直接修改cmakeFlags解决了我的问题:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
cmakeFlags = [
"-DPYTHON_EXECUTABLE=${pkgs.python.interpreter}"
"-DPYBIND11_TEST=OFF"
];
});
但我想知道为什么前一种方法不起作用。
它不起作用,因为推导是使用 rec
关键字,它没有覆盖的概念。节选:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation rec { #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
}
使用 .overrideAttrs (oldAttrs: { doCheck = false; })
你只覆盖 doCheck
属性,而不是 cmakeFlags
,它仍然引用词法中的 doCheck
(#1
) rec {}
(#0
)
因此以下内容等同于上面的代码段:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation (let #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
in { #0
name = name;
version = version;
doCheck = doCheck; #1
cmakeFlags = cmakeFlags;
}
mkDerivation
只能看到它得到的attrset,但不能反省和修改构建那个attrset的表达式。这是一个必要的 Nix 语言设计原则,因为它可以让您推理代码并实现惰性。 rec
语义根本不适合覆盖。