Настройка: у меня есть библиотека Haskell HLib
, которая делает вызовы на бэкэнд C/С++ CLib
для эффективности. Бэкэнд небольшой и специализирован для использования с HLib
. Интерфейс CLib
будет отображаться только через HLib
; Тесты HLib
, тесты HLib
и сторонние библиотеки в зависимости от HLib
не будут направлять прямые вызовы FFI на CLib
. С точки зрения тестирования/бенчмарка/третьей стороны, HLib
должен отображаться чисто Haskell. Это означает, что в разделах файла кэша для, например, тестов HLib
не должно быть ссылок на -lCLib
, libCLib
и т.д., Только build-depends
на HLib
, и что исполняемым файлам не нужно искать для динамической библиотеки CLib
. Мне нужно иметь возможность создавать и запускать все исполняемые файлы в HLib
и сторонних библиотеках, а также запускать cabal repl
для разработки.
Первоначально CLib
был написан в чистом C. Кабаль имеет поддержку для этого случая, и я могу интегрировать CLib
в HLib
точно так, как описано выше, используя include-dirs
, c-sources
и includes
в файле cabal.
CLib
превратился в библиотеку С++, и я не мог понять, как легко интегрировать кэбаль. Вместо этого я прибегал к make файлу с пользовательской сборкой и Setup.hs, например this. Вы можете увидеть небольшой пример этого метода здесь 1,2.
В этом примере я не могу запустить cabal repl
в HLib
, потому что "Загрузка архивов не поддерживается". Это действительно означает, что мне нужна динамическая библиотека С++, которая достаточно проста для создания (там есть прокомментированная строка в make файле CLib
). Однако, если я делаю динамическую С++-библиотеку, тест для HLib
завершается с ошибкой во время выполнения из-за отсутствия такого файла или каталога libclib.so. Это плохо (в дополнение к сбою), потому что тестовый исполняемый файл связан с динамической библиотекой, чего я не хочу.
Конкретно, тесты для HLib
и SimpleLib
должны пройти, и я должен иметь возможность запускать cabal repl
в каталогах HLib
и SimpleLib
.
Другие вещи, которые я пробовал: этот ответ, этот ответ (который я не могу получить для компиляции), this и чтение документов (приводит к ошибкам "перемещения" ).
Я использую GHC-7.10.3 на данный момент, хотя, если это значительно проще в 8.0, это прекрасно.
[1] Упрощено из lol/problems.
[2] Загрузите и запустите ./sandbox-init
. Это создает HLib
(который неявно строит CLib
и SimpleLib
, который является библиотекой Haskell, которая зависит от HLib
.