• 我们已经写了一个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

  • (注:我们把findutilspatchelf加到了autotoolsv2.nixbaseInputs中)

    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.nixdefault.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