Как можно использовать инструменты конфигурации, такие как sdl-config, с кабальным проектом? - PullRequest
9 голосов
/ 17 мая 2011

У меня есть работающее приложение SDL / Haskell, которое я хотел бы построить с использованием Cabal вместо текущего Makefile (потому что это «путь Haskell»). Makefile сам по себе очень прост, и я надеялся, что процесс сборки cabal по умолчанию позволит мне восстановить команду сборки, указанную в моем Makefile. Проблема в том, что он использует «sdl-config», утилиту, которая предоставляет вам все необходимые опции cc-компилятора:

wrapper.o: SDLWrapper_stub.h
    ghc -no-hs-main `sdl-config --cflags` -Wall wrapper.c -c

Кажется, что Cabal не превращает это в вызов оболочки при вызове GHC. Как я могу указать, что параметры sdl-config должны передаваться в GHC при компиляции wrapper.o?

Ответы [ 2 ]

8 голосов
/ 17 мая 2011

Используя стиль configure в Cabal, вы можете написать небольшой скрипт configure, который заменяет переменную для вывода команды sdl-config. Затем значения будут заменены в файле $ foo.buildinfo.in, в результате будет получен файл $ foo.buildinfo, который Cabal включит в процесс сборки.

Общее решение: скрипт настройки

 #!/bin/sh

 SDLFLAGS=`sdl-config --cflags`
 echo Found "$SDLFLAGS"
 sed 's,@SDLFLAGS@,'"$SDLFLAGS"',' z.buildinfo.in > z.buildinfo       

Файл $ foo.builinfo.in

cc-options: @SDLFLAGS@

.Cabal файл

Build-type:          Configure

Когда вы запускаете "cabal configure", будет создано поле "cc-options" в z.buildinfo для хранения:

cc-options: -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT 

Какая клика будет включена в сборку.

Готово.

Специальное решение для инструментов pkg-config

Для инструментов, которые поддерживают pkg-config -стиль конфигурации, например sdl или cairo и другие, Cabal уже имеет специальную поддержку:

pkgconfig-зависит: список пакетов

Список пакетов pkg-config, необходимых для сборки этого пакета. Они могут быть аннотированы версиями, например GTK + -2,0> = 2,10, Каир> = 1,0. Если ограничение версии не указано, любая версия считается приемлемой. Cabal использует pkg-config, чтобы определить, доступны ли пакеты в системе, и найти дополнительные параметры компиляции и компоновщика, необходимые для использования пакетов.

Если вам нужно привязать библиотеку C, которая поддерживает pkg-config (используйте pkg-config --list-all, чтобы узнать, поддерживается ли она), тогда гораздо предпочтительнее использовать это поле, чем параметры жесткого кода в другие поля.

Так что для sdl вам просто нужно:

pkgconfig-depends: sdl
3 голосов
/ 17 мая 2011

Используйте тип сборки Configure в своем файле $PROJ_NAME.cabal и создайте файл $PROJ_NAME.buidinfo из шаблона $PROJ_NAME.buildinfo.in с помощью скрипта configure. Посмотрите на источник библиотеки SDL в Hackage для примера. Этот раздел руководства пользователя Cabal содержит более подробную информацию.

Один совет: не забудьте упомянуть $PROJ_NAME.buildinfo.in и configure в поле extra-source-files.

...