我现在了解如何编写shell.nix
我正在开发的项目的基本内容。我有这样的事情:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
cmake
boost
eigen
];
}
然而,这个项目还依赖于另一个包(例如,cln
),我需要从 git 存储库下载源代码并使用一些特殊标志进行编译。该包使用autoconf
,我只需要启用/禁用一些选项。我不知道如何实现这一目标shell.nix
。以下是我目前的尝试,是我通过各种谷歌搜索拼凑而成的。它不起作用,我不知道如何修复它(或如何搜索帮助):
with import <nixpkgs> {};
stdenv.mkDerivation { # this line causes an error
name = "cln-m1";
src = fetchurl {
url = "https://www.ginac.de/CLN/cln-1.3.6.tar.bz2";
}; # I also want to pass some flags to "configure" here
}
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
cmake
boost
eigen
cln-m1 # this is the customized package I want to add
];
}
此代码不起作用,因为该stdenv.mkDerivation...
行产生错误:
错误:尝试调用不是函数而是集合的东西
我想修复这个问题,并能够在构建脚本之前将一些标志传递到脚本中configure
,cln
并使用自定义的cln
( cln-m1
) 作为此 shell 的依赖项。
答案1
嗯,这就像基本的函数式编程。
with import <nixpkgs> {};
let
cln-m1 = stdenv.mkDerivation { # this line causes an error
name = "cln-m1";
src = fetchurl {
url = "https://www.ginac.de/CLN/cln-1.3.6.tar.bz2";
}; # I also want to pass some flags to "configure" here
};
in pkgs.mkShell {
nativeBuildInputs = with pkgs; [
cmake
boost
eigen
cln-m1 # this is the customized package I want to add
];
}