2015-09-20 112 views
3

在我的例子中,我在Haskell包bindings-libzip上的Cabal文件中有一個依賴項。特別是,我可以接受幾種不同版本的libzip,例如, bindings-libzip-0.11bindings-libzip-0.10。這些又依賴於各自的本地文庫0.110.10如何使用Cabal將Haskell依賴關係的版本固定爲基礎本地依賴項的版本?

因此我在我的.cabal文件中有bindings-libzip >= 0.10 < 0.12

Haskell包bindings-libzip-x指定PkgConfig-Dependslibzip版本x必須存在於客戶機上。假設下游用戶安裝了libzip的版本0.10。但是,當下拉我的包時,此用戶可能會拉下最新的依賴關係,並且會傳遞性地下拉bindings-libzip0.11版本。這會導致構建過程出錯,並顯示有關安裝的libzip版本不正確的消息。

有什麼辦法,我可以在我的.cabal文件指定要使用bindings-libzip-0.11當且僅當pkg-config檢測的libzip0.11版本,並使用bindings-libzip-0.10當且僅當pkg-config檢測版本的libzip0.10

回答

2

我提交另一份答案,因爲這裏採用的另一個想法...

使用自定義Setup.hs與defaultMainWithHooksArgs允許您檢查和修改參數傳遞給了cabal configure命令。

這是一個Setup.hs它確實沒有修改:

import Distribution.Simple 
import Distribution.Simple.Configure 
import System.Environment 

main = do 
    args <- getArgs 
    defaultMainWithHooksArgs simpleUserHooks args 

如果.cabal文件有:

Flag Foo 
    Default: False 

定義的標誌,e.g然後在ARGS你會看到"--flags=-foo"。這樣的想法是:

  1. 定義在.cabal文件中的兩個標誌 - use10use11選擇使用哪種bindings-libzip版本。
  2. 在您的自定義Setup.hs中確定要使用的版本。
  3. 查找"--flags=..." arg,並在將其傳遞給defaultMainWithHooksArgs之前對其進行適當修改。
1

我認爲要做到這一點的方法是使用自定義的Setup.hs文件

您可以通過使用一個main像這樣覆蓋構建過程的特定階段(在.cabal文件中指定build-type: Custom):

main = defaultMainWithHooks $ simpleUserHooks { preConf = myPreConf } 

myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo 
myPreConf args configFlags = ... 

這也可能是重寫confHook是你想要的。

一些鏈接:

例子。HS文件覆蓋confHook

abcBridge arb-fft cabalmdvrpm darkplaces-text GLFW happybara-webkit-server haskeline HDBC-postgresql helics hlbfgsb hlibsass hpqtypes hruby hsqml hubris illuminate intel-aes keera-posture KiCS-debugger libpq llvm-general morfeusz postgresql-libpq tamarin-prover tamarin-prover-term tamarin-prover-theory tamarin-prover-utils voyeur wxc wxcore

特別是,hruby Setup.hs看起來像是在做你想做的事情。