Haskell/Stack/Nix构建失败,需要pkg-config> = 0.9.0和cairo> = 1.2.0,但最新版本是pkg-config 0.29.2和cairo 1.15.4

say*_*ylu 3 haskell cairo nix haskell-stack nixpkgs

我正在使用Stack和Nix构建一个Haskell项目,具体取决于cairoHackage中的库.

当我构建项目时,我收到一个错误:无法找到pkg-config >= 0.9.0cairo >= 1.2.0.但是,根据他们的网站的最新版本是pkg-config 0.29.2cairo-1.15.4,这也反映在Nix包管理器中.

另一方面,2006年这篇文章宣布了Cairo 1.2.0的发布,这进一步混淆了这个问题.

问题

  1. 为什么预期版本nixpkgspkg-config/ cairowebsite 上的已发布版本有很大不同?

  2. 你有什么建议cairo在macOS上构建(最好的情况:使用Nix作为系统包,使用Stack for Haskell包)

重现步骤:

> stack new cairo-test simple && cd cairo-test

# Now, to get Cairo
> stack install cairo

cairo-0.13.3.1: configure ...
Process exited with code: ExitFailure 1
Configuring cairo-0.13.3.1...
setup: The program 'pkg-config' version >=0.9.0 is required but it could not be found.

# This version doesn't seem to exist (not on the pkg-config website, either).
> nix-env -qaP pkg-config
nixpkgs.pkgconfig          pkg-config-0.29.2
nixpkgs.pkgconfigUpstream  pkg-config-0.29.2

# However, if installed, a new error:
> nix-env -i pkg-config
installing ‘pkg-config-0.29.2’
building path(s) ‘/nix/store/m4ks2si7b78757c1rc43r0833pxkvjb3-user-environment’
created 102 symlinks in user environment
> stack install cairo
setup: The pkg-config package 'cairo' version >=1.2.0 is required but 
it could not be found.

# Again, this version doesn't seem to exist, either on the site on in `nixpkgs`
> nix-env -qaP cairo
nixpkgs.cairo  cairo-1.14.8

# Installing it anyway, to see what the next error is
> nix-env -i cairo
installing ‘cairo-1.14.8’
building path(s) ‘/nix/store/dcx0in96wcd7yd8q71y93jd5306vag8g-user-environment’
created 112 symlinks in user environment

# Get the same version error now that Cairo is installed
setup: The pkg-config package 'cairo' version >=1.2.0 is required but it could not be found.
Run Code Online (Sandbox Code Playgroud)

rob*_*obx 6

问题不在于库版本,1.14.8而是大于1.2.0.问题是cairo开发文件没有链接到你的环境,也就是说$PKG_CONFIG_PATH没有设置.

三种解决方案

  1. 找到cairo-dev目录/nix/store,并将其添加到PKG_CONFIG_PATH.例如,

     $ cairodev=$(nix-store --query --outputs $(nix-instantiate '<nixpkgs>' -A cairo) | grep dev$)
     $ export PKG_CONFIG_PATH=$cairodev:$PKG_CONFIG_PATH
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从nix shell中运行堆栈,nix-shell -p pkgconfig cairo.

  3. 使用stack的nix支持,通过添加以下内容stack.yml:

    nix:
      enable: true
      packages: [pkgconfig, cairo]
    
    Run Code Online (Sandbox Code Playgroud)