Cabal: Custom build

42 views
Skip to first unread message

Oleg Durandin

unread,
Jun 5, 2014, 9:23:57 AM6/5/14
to haskell...@googlegroups.com
Всем привет!

Скажите, кто-нибудь сталкивался с необходимостью использовать Custom в качестве build-type?

Потребовалось изменить процедуру простройки Cabal'a, и совсем закопался в Setup.hs 
Изучение http://www.haskell.org/ghc/docs/7.0.4/html/libraries/Cabal/ не помогло - не могу понять саму процедуру как модифицировать этапы простройки.
Кто нибудь сталкивался с данной проблемой? Очень нужен совет!
Или может быть кто-нибудь выручит ссылкой на tutorial по данному вопросу? я так и не нашел ничего толкового...

Alexandr Voidex

unread,
Jun 5, 2014, 9:59:53 AM6/5/14
to haskell...@googlegroups.com
Смотря, что надо.
В Distribution.Simple есть defaultMainWithHooks, куда можно соответствующие функции подсунуть. Я так в давние времена делал возможность собрать .dll под виндой.

четверг, 5 июня 2014 г., 17:23:57 UTC+4 пользователь Oleg Durandin написал:

Oleg Durandin

unread,
Jun 5, 2014, 10:02:06 AM6/5/14
to haskell...@googlegroups.com
Как раз и нужно собрать dll под винду.
Можете поделиться опытом?

Буду очень признателен.

четверг, 5 июня 2014 г., 17:59:53 UTC+4 пользователь Alexandr Voidex написал:

Alexandr Voidex

unread,
Jun 5, 2014, 10:14:14 AM6/5/14
to haskell...@googlegroups.com
Да, конечно
Вот код, в .cabal необходимо добавить секцию x-export, в которой перечислить все модули, содержащие экспортируемые функции, дабы эти модули были добавлены в сгенерированном .c-файле при помощи hs_add_root.
Код писал давно и на коленке, так что что-то уже может быть неактуально, я не проверял. Возникнут вопросы — спрашивайте, попытаюсь помочь.

четверг, 5 июня 2014 г., 18:02:06 UTC+4 пользователь Oleg Durandin написал:

Alexandr Voidex

unread,
Jun 5, 2014, 10:27:59 AM6/5/14
to haskell...@googlegroups.com
Совсем забыл, там используется тулза dll2lib для генерации .lib файла

четверг, 5 июня 2014 г., 18:14:14 UTC+4 пользователь Alexandr Voidex написал:

Alexandr Voidex

unread,
Jun 5, 2014, 10:36:01 AM6/5/14
to haskell...@googlegroups.com
И даже ещё одна: exports2def, надеюсь, что ничего не забыл. Возможно, сейчас они не понадобятся. Чтобы не спамить сюда, можно мне напрямую по возникшим вопросам: voi...@live.com

четверг, 5 июня 2014 г., 18:27:59 UTC+4 пользователь Alexandr Voidex написал:

Oleg Durandin

unread,
Jun 6, 2014, 3:14:34 AM6/6/14
to haskell...@googlegroups.com
Огромное спасибо!
Буду пытаться разобраться, но если что напишу Вам :)
Еще раз большое спасибо :)

четверг, 5 июня 2014 г., 18:36:01 UTC+4 пользователь Alexandr Voidex написал:

nponeccop

unread,
Jun 6, 2014, 7:13:28 AM6/6/14
to haskell...@googlegroups.com


On Thursday, June 5, 2014 5:02:06 PM UTC+3, Oleg Durandin wrote:
Как раз и нужно собрать dll под винду.
Можете поделиться опытом?

Буду очень признателен.


Cборка DLL под винду давно работает из коробки. Достаточно сabal-configure --enable-shared

Oleg Durandin

unread,
Jun 9, 2014, 2:19:29 AM6/9/14
to haskell...@googlegroups.com
Да, я уже находил это и даже делал, но возникли некоторые проблемы.
Приведу простой пример: простой пример с использованием FFI
Приведены функции:
  • hello для вывода строчки;
  • getCStringFromKey получить строчку из Haskell-окружения и вернуть её в С++;
  • printCString - получить строчку из С++ и вывести её в Haskell окружении;
Если я провожу компиляцию при помощи ghc вручную, с использованием команд:
>ghc -c grepWrap.hs
>ghc -shared grepWrap.o
На выходе получаю файлы: HSdll.dll (размером 1 349 Кб) и HSdll.dll.a (размером 2 228 Кб). Ну и конечно header-файл.
В последующем я с легкостью использую эти файлы в моем проекте на MS Visual Studio. 

В случае, если я использую сборку с использованием cabal'a:
Вот секция library:
library
  exposed-modules: GrepWrap      
  build-depends:       base ==4.6.*

Сборку осуществляю следующим набором команд:
>cabal configure --enable-shared
>cabal build

На выходе, помимо header-файла я получаю libHSsimpleCabal-0.1.0.0-ghc7.6.3.dll (48 Кб) и libHSsimpleCabal-0.1.0.0-ghc7.6.3.dll.a (41 Кб).
При использовании которых я получаю сл. ошибки:
1>SimpleCabalCPP.obj : error LNK2019: unresolved external symbol _hs_init referenced in function _main
1>SimpleCabalCPP.obj : error LNK2019: unresolved external symbol _hs_exit referenced in function _main
Проще говоря, они тянут за собой целый набор файлов.

Мне хотелось бы этого избежать и при помощи Cabal'a выполнить простройку dll полностью эквивалентную простройке dll при помощи ghc.

пятница, 6 июня 2014 г., 15:13:28 UTC+4 пользователь nponeccop написал:
Reply all
Reply to author
Forward
0 new messages