2017-09-30 78 views
0

的陰謀沒有在下面的例子中發現的問題是,如何正確的例子,這樣的陰謀被發現。如何製作cabal在straigthforward nix-pill 8.1模仿中找到?

這個例子是the nix pill 8.1非常straigthforward修飾。在nix-repl,打字:l <nixpkgs>然後"${cabal-install}"給予賣場裏小集團安裝是它包含的子迪爾斯有彬有含陰謀可執行的路徑。即

> /nix/store/pathtocabal-install/bin/cabal -v 
cabal-install version 2.0.0.0 
compiled using version 2.0.0.2 of the Cabal library 

下面您應該找到與「make c」示例對應的文件。

有了它們,在

> nix-build hello.nix 

不起作用。它首先告訴打造「這些推導」,然後說

hello_builder.sh: line 2: cabal: command not found 

我懷疑$小集團安裝/ bin中是一個錯誤的方式來引用的陰謀,但是,nix-repl發現其商店路徑。

hello_builder.sh比在c例子更短。請注意,安裝部件仍然缺失(首先應該找到建造者來找到cabal)。不需要也許binutils的 -

export PATH="$coreutils/bin:$ghc/bin:$cabal-install/bin:$binutils/bin" 
cabal build hello 

hello.nix。

with (import <nixpkgs> {}); 
derivation { 
    name = "hello"; 
    builder = "${bash}/bin/bash"; 
    args = [ ./hello_builder.sh ]; 
    inherit binutils coreutils ghc cabal-install; 
    src = ./hello.cabal; 
    system = builtins.currentSystem; 
} 

hello.cabal - 在nix-shell與陰謀安裝和GHC,這個工程。

name:    hello 
version:    0.1.0.0 
build-type:   Simple 
cabal-version:  >=1.24 

executable hello 
    main-is:    hello.hs 
    default-language: Haskell2010 
    build-depends:  base    >=4.9 && <4.10 

hello.hs

module Main where 

main :: IO() 
main = putStrLn "Hello there!" 

後期補充:

通過添加echo $PATH的建設者,我們可以看到,路徑是不正確的。它是/nix/store/...coreutils-8.28/bin:/nix/store...ghc-8.0.2/bin:-install/bin:/nix/store/...binutils-2.28.1/bin。那裏$cabal變成一個空字符串,它不是指$cabal-install。因此,cabal可執行文件沒有正確的存儲路徑。

這個答案的原因部分以及如何糾正它保持的一部分。而開放的原因 - 部分是,爲什麼inherit cabal-install不能在這裏使用。

回答

1

的問題inherit cabal-install;cabal-install不是BASH有效的變量名。 Nix將提供的集合中的密鑰轉換爲BASH中的變量,即derivation

而不是inherit cabal-install;你可以做一些像cabal_install = cabal-install;,然後在你的建設者使用cabal_install