查看: https: //github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/pybind11/default.nix,在我看来,我应该能够避免运行测试(即 set -DPYBIND11_TEST=OFF)像下面这样:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
doCheck = false;
});
Run Code Online (Sandbox Code Playgroud)
然而,这是行不通的。
我通过直接修改cmakeFlags解决了我的问题:
pybind11 = pkgs.pybind11.overrideAttrs (oldAttrs: rec {
cmakeFlags = [
"-DPYTHON_EXECUTABLE=${pkgs.python.interpreter}"
"-DPYBIND11_TEST=OFF"
];
});
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么前一种方法不起作用。
它不起作用,因为派生使用关键字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"}"
];
}
Run Code Online (Sandbox Code Playgroud)
您.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;
}
Run Code Online (Sandbox Code Playgroud)
mkDerivation只能看到它获取的 attrset,但无法内省和修改构建该 attrset 的表达式。这是必要的 Nix 语言设计原则,因为它可以让您推理代码并实现惰性。语义rec根本不适合覆盖。
| 归档时间: |
|
| 查看次数: |
1854 次 |
| 最近记录: |