目录
1 input design pattern
我们已经写了一个
setup.sh
来方便nix-shell
处于一个和nix-build
类似的隔离环境,并有分步构建,手动调试的能力,并且用其来构建了一个包(GNU hello
)。但是当包多了起来,集中管理就变得重要。除此之外,我们写的包过于耦合,不便于用户定制化(比如用户可能想要一个包的不同版本,或者为某个包添加特性等),应该添加某些“选项”来让用户输入,而函数的参数正是用来做这个的以构建graphviz-2.49.3.tar.gz来说 如果需要让其支持png格式,那么需要额外的库:
gd
,并且需要用pkg-config
来提供编译选项。为了让Nix能在隔离的环境中让pkg-config
找到对应的.pc
文件,需要在setup.sh
中export环境变量PKG_CONFIG_PATH
(注:我们把
findutils
和patchelf
加到了autotoolsv2.nix
的baseInputs
中)setup.sh
1 2 3 4 5 6 7 8
for p in $baseInputs $buildInputs; do # other code ... if [ -d $p/lib/pkgconfig ]; then # libname/lib/pkgconfig 是包含.pc文件的目录 export PKG_CONFIG_PATH="$p/lib/pkgconfig${PKG_CONFIG_PATH:+:}$PKG_CONFIG_PATH" fi done
然后在
graphviz.nix
中添加gd
的包就行graphviz.nix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
{ mkDerivation, lib, gdSupport ? true, gd, pkg-config }: mkDerivation { name = "graphviz"; src = ./graphviz-2.49.3.tar.gz; buildInputs = if gdSupport then [ pkg-config (lib.getLib gd) (lib.getDev gd) ] else []; }
hellov4.nix
1 2 3 4 5 6 7 8
{ mkDerivation, }: mkDerivation { name = "hellov3"; src = ./hello-2.12.1.tar.gz; }
把两个包集合在
default.nix
里default.nix
1 2 3 4 5 6 7 8 9 10 11
let pkgs = import <nixpkgs> { }; mkDerivation = import ./autotoolsv2.nix pkgs; in with pkgs; { hello = import ./hellov4.nix { inherit mkDerivation findutils patchelf; }; graphviz = import ./graphviz.nix { inherit mkDerivation lib gd pkg-config; }; graphvizCore = import ./graphviz.nix { inherit mkDerivation lib gd pkg-config; gdSupport = false; }; }
当我们想要构建其中的
graphviz
包时,可以nix-build -A graphviz