【问题标题】:nix: override doCheck in pybind11nix:覆盖 pybind11 中的 doCheck
【发布时间】:2019-06-12 19:35:35
【问题描述】:

看着: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"
      ];
  });

但我想知道为什么前一种方法不起作用。

【问题讨论】:

    标签: nix


    【解决方案1】:

    它不起作用,因为派生使用了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,它仍然从rec {} (#0) 引入的词法范围中引用doCheck (#1)

    所以下面相当于上面的sn-p:

    { 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 语义根本不适合覆盖。

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2020-07-28
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多