这是我想要的用例:
我有一个包含单个模块的软件包,可读取HDF5文件并将其部分数据写入Haskell记录。为了完成这项工作,该库使用bindings-hdf5
包。这是我的阴谋集团build-depends
。 reader-types
是我编写的一个模块,它定义了包含读入数据的Haskell记录的类型。
build-depends: base >=4.7 && <4.8
, text
, vector
, containers
, bindings-hdf5
, reader-types
请注意,我的cabal
文件目前不使用extra-libraries
或ghc-options
。只要我指定所需的src/Mabel.hs
库,我就可以在ghci中加载我的模块hdf5_hl
:
ghci src/Mabel.hs -lhdf5_hl -L/long/nixos/path/lib
在ghci中,我可以很好地运行我的功能。
现在,我想要做的是将这个库/模块编译成一个编译后的文件,稍后我可以在另一个Haskell程序中加载GHC API。通过单个文件,我的意思是即使系统上不存在hdf5_hl
库,它也需要运行。优选地,即使text
,vector
和/或containers
丢失,它也会运行,但这不是必需的,因为reader-types
无论如何都需要这些类型。使用GHC API加载模块时,我希望它以已编译的形式加载,而不是运行解释。
我这样做的目的是希望自包含文件充当单个预编译的插件文件,该文件稍后由不同的Haskell可执行文件加载和执行。其他插件可能根本不使用hdf5,他们保证使用的唯一包是reader-types
,它基本上定义了插件接口类型。
我系统上的hdf5库包含以下文件:libhdf5_la.la
,libhdf5_hl.so
,libhdf5.la
,libhdf5.so
以及文件名中包含版本号的类似文件
我做了很多谷歌搜索,但我对所发现的所有边缘情况感到困惑。以下是一些我不确定不适合我的情况的例子,或者我说不出来。
bindings-hdf5
)中指定了绑定。extra-libraries: hdf5_hl
或extra-libraries: hdf5
,在这两种情况下dist/build
中生成的.a,.so,.dyn_hi,.dyn_o,.hi和.o文件的大小与不使用extra-libraries
的大小完全相同,所以我确信它不起作用正确。我需要对cabal
文件进行哪些更改才能创建一个自包含的独立文件,以后可以使用GHC API加载?如果这是不可能的,有哪些替代方案?
我也可以使用plugins
库来加载插件,而不是使用GHC API,但是自包含的要求仍然是相同的。