在我的特殊情况下,我在Haskell软件包bindings-libzip
上的阴谋集团文件中有一个依赖项。特别是,我可以接受几种不同版本的libzip
,例如 bindings-libzip-0.11
或bindings-libzip-0.10
.这些又依赖于各自的本机 C libzip
库版本 0.11
和 0.10
。
因此,我在.cabal
文件中bindings-libzip >= 0.10 < 0.12
。
Haskell软件包bindings-libzip-x
PkgConfig-Depends
指定客户端计算机上必须存在libzip
版本x
。假设下游用户安装了版本 0.10
的 libzip
。但是,在拉下我的包时,此用户会拉下可能的最新依赖项,并传递下拉bindings-libzip
的版本0.11
。这会导致生成过程出错,并显示有关安装libzip
版本不正确的消息。
有什么方法可以在我的 .cabal 文件中指定当且仅当pkg-config
检测到libzip
的版本 0.11
时使用 bindings-libzip-0.11
,并且当且仅当pkg-config
检测到libzip
的版本 0.10
时使用 bindings-libzip-0.10
?
我提交另一个答案,因为这使用了另一个想法......
使用带有defaultMainWithHooksArgs
的自定义 Setup.hs 允许您检查和修改 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
然后在 args 中您将看到"--flags=-foo"
.所以这个想法是:
- 在 .cabal 文件中定义两个标志 -
use10
和use11
以选择要使用的bindings-libzip
版本。 - 在自定义 Setup.hs 中确定要使用的版本。
- 找到
"--flags=..."
参数并对其进行适当修改,然后再将其传递给defaultMainWithHooksArgs
。
的方法是使用自定义Setup.hs
文件(在 .cabal 文件中指定build-type: Custom
。
可以使用如下所示的main
重写生成过程的特定阶段:
main = defaultMainWithHooks $ simpleUserHooks { preConf = myPreConf }
myPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
myPreConf args configFlags = ...
覆盖confHook
也可能是您想要的。
一些链接:
- 所有阴谋集团的钩子:
data UserHooks
- 标准挂钩组:(链接(
自定义 Setup.hs 文件覆盖confHook
的示例:
abc桥arb-fft卡巴尔姆德弗普姆暗处-文本格利福快乐的巴拉-webkit-服务器哈斯克林HDBC-postgresql螺旋HLBFGSB赫利布萨斯HPQ类型赫鲁比高空傲慢照亮英特尔-AES基拉姿势KiCS-debugger利卜普克LLVM-General莫尔费什Postgresql-libpq狨猴-普罗弗狨猴-证明剂狨猴证明者理论Tamarin-prover-utilsWXCWXCore
特别是,hruby Setup.hs看起来像是在做你想做的事情。