Вы можете использовать пользовательский хук Makefile
/ Setup.hs
и вызывать windres
(если вы в Windows) или objcopy
/ elfrc
(если вы в Linux) для компиляции ресурсов в COFF / ELF объекты, которые вы можете затем объединить с вашими объектными файлами Haskell, чтобы сформировать конечный исполняемый файл. Затем вы можете получить доступ к ресурсам, используя Haskell FFI следующим образом (не проверено):
-- We have an image resource called "_imgdata"
foreign import ccall "&" _imgdata :: CString
-- Size of _imgdata is 405585 bytes.
imgdata :: CStringLen
imgdata = (_imgdata, 405585)
Это решение будет более эффективным, чем использование file-embed (без преобразования CString
-> ByteString
), но и более сложным.
Кроме того, мне также понадобилась поддержка файла ресурсов во время моей работы над cabal-install , поэтому он, вероятно, будет интегрирован в какую-то будущую версию Cabal (если я ее реализую).