nix: переопределить doCheck в pybind11 - PullRequest
2 голосов
/ 12 июня 2019

Глядя на: 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"
      ];
  });

Но мне было интересно, почему прежний подход не работает.

1 Ответ

1 голос
/ 12 июня 2019

Это не работает, потому что при выводе используется ключевое слово 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 может видеть только тот набор атрибутов, который он получает, но не может анализировать и изменять выражение, которое создает этот набор атрибутов. Это необходимый принцип проектирования языка Nix, поскольку он позволяет вам размышлять над кодом и обеспечивает лень. Семантика rec просто не подходит для переопределения.

...