2011-05-17 8 views
9

Mam działającą aplikację SDL/Haskell, którą chciałbym zbudować używając Cabal zamiast aktualnego Makefile (ponieważ jest to "sposób Haskella"). Plik Makefile jest sam w sobie bardzo prosty i miałem nadzieję, że domyślny proces budowania cabal pozwoli mi zrekonstruować polecenie build określone w moim Makefile. Problemem jest to, że wykorzystuje „SDL-config”, narzędzie, które zapewnia wszystkie niezbędne opcje kompilatora CC:W jaki sposób można używać narzędzi konfiguracyjnych, takich jak sdl-config, z kabalizowanym projektem?

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

Cabal nie wydają się rozszerzyć, że do wywołania powłoki podczas wywoływania GHC. Jak mogę określić, że opcje sdl-config powinny być podawane do GHC podczas kompilowania wrapper.o?

Odpowiedz

8

Używając stylu w Cabal, możesz napisać mały skrypt konfiguracyjny, który zastępuje zmienną dla wyjścia polecenia sdl-config. Wartości zostaną następnie zastąpione w pliku $ foo.buildinfo.in, tworząc plik $ foo.buildinfo, który Cabal uwzględni w procesie kompilacji.

rozwiązanie ogólne: skrypt configure

#!/bin/sh 

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

$ plik foo.builinfo.in

cc-options: @[email protected] 

Plik .cabal

Build-type:   Configure 

Po uruchomieniu „Cabal Configure” z „CC-options” pola w z.buildinfo zostanie utworzony do przechowywania:

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

który klika obejmie w kompilacji.

Gotowe.

konkretnego rozwiązania dla narzędzi pkg-config

przypadku narzędzi, które wspierają pkg-config-style konfiguracji, takich jak sdl lub cairo i innych, Cabal ma wsparcia już:

pkgconfig-depends: package list

A list of pkg-config packages, needed to build this package. They can be annotated with versions, e.g. gtk+-2.0 >= 2.10, cairo >= 1.0. If no version constraint is specified, any version is assumed to be acceptable. Cabal uses pkg-config to find if the packages are available on the system and to find the extra compilation and linker options needed to use the packages.

If you need to bind to a C library that supports pkg-config (use pkg-config --list-all to find out if it is supported) then it is much preferable to use this field rather than hard code options into the other fields.

więc dla sdl potrzebujesz:

pkgconfig-depends: sdl 
+0

Hej. Postępowałem zgodnie z twoją instrukcją, a Mikhail do edycji.plik cabal; kiedy próbuję zbudować otrzymuję coś takiego: cabal: błąd wewnętrzny: pakiet zawiera bibliotekę, ale nie ma odpowiadających jej danych konfiguracyjnych Ale mój projekt nie zawiera biblioteki. Zawiera tylko jeden plik wykonywalny. Co może oznaczać ta wiadomość? :/ – fatuhoku

+0

Sprawdź składnię pliku .cabal (lub spróbuj wygenerować nową z 'cabal init'). Najpierw jednak zarchiwizuj stary plik .cabal. –

+0

Bez powodzenia. Ta sama wiadomość. W rzeczywistości oryginalny plik został wygenerowany za pomocą 'cabal init', a ja zmieniłem bardzo niewiele rzeczy. Złożyłem ten plik jako błąd cabal na hackage trac. Sądzę, że jest dla mnie wystarczająco jasne, że wiadomość nie opisuje tego problemu w odpowiedni sposób. – fatuhoku

3

Użyj typ Configure kompilacji w pliku $PROJ_NAME.cabal i wygenerować plik $PROJ_NAME.buidinfo z $PROJ_NAME.buildinfo.in szablonu z configure skryptu. Sprawdź przykład biblioteki SDL w Hackage. This section w podręczniku użytkownika Cabal zawiera więcej informacji.

Jedna wskazówka: nie zapomnij wspomnieć o $PROJ_NAME.buildinfo.in i configure w polu extra-source-files.

Powiązane problemy