目录
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.sh1 2 3 4 5 6 7 8for 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.nix1 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.nix1 2 3 4 5 6 7 8{ mkDerivation, }: mkDerivation { name = "hellov3"; src = ./hello-2.12.1.tar.gz; }把两个包集合在
default.nix里default.nix1 2 3 4 5 6 7 8 9 10 11let 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