2011-05-17 11 views
9

Tengo una aplicación SDL/Haskell en funcionamiento que me gustaría construir usando Cabal en lugar del Makefile actual (porque ese es el "modo Haskell"). El Makefile es en sí mismo muy simple, y esperaba que el proceso de compilación cabal por defecto me permitiera reconstruir un comando de compilación especificado en mi Makefile. El problema es que hace uso de "sdl-config", una utilidad que le da todas las opciones necesarias CC- compilador: no parece¿Cómo se pueden usar las herramientas de configuración como sdl-config con un proyecto cabalizado?

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

Cabal para expandir eso en una llamada concha al llamar GHC. ¿Cómo puedo especificar que las opciones de sdl-config se deben alimentar a GHC al compilar wrapper.o?

Respuesta

8

Usando el estilo configure en Cabal, puede escribir un pequeño script de configuración que sustituye una variable para el resultado del comando sdl-config. Los valores luego serán reemplazados en un archivo $ foo.buildinfo.in, produciendo un archivo $ foo.buildinfo, que Cabal incluirá en el proceso de compilación.

solución general: el script de configuración

#!/bin/sh 

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

El archivo $ foo.builinfo.in

cc-options: @[email protected] 

El archivo .cabal

Build-type:   Configure 

Al ejecutar "configure cabal" del campo "CC-options" en z.buildinfo se creará para contener:

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

la que Cabal incluirá en la construcción.

Listo.

Solución específica para herramientas pkg-config

Para las herramientas que soportan el pkg-config-style de configuración, tales como sdl o cairo y otros, Cabal tiene apoyo específico ya:

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.

Así que para sdl solo necesita:

pkgconfig-depends: sdl 
+0

Hey. Seguí tus instrucciones y Mikhail en la edición de.archivo cabal; cuando trato de construir me sale algo como: cabal: error interno: el paquete contiene una biblioteca pero no hay datos de configuración correspondientes Pero mi proyecto no contiene una biblioteca. Contiene solo un ejecutable. ¿Qué podría significar este mensaje? :/ – fatuhoku

+0

Compruebe la sintaxis de su archivo .cabal (o intente generar uno nuevo con 'cabal init '). Sin embargo, primero haga una copia de seguridad de su viejo archivo .cabal. –

+0

Sin suerte. El mismo mensaje. De hecho, el archivo original se generó con 'cabal init', y he cambiado muy pocas cosas. Presenté este como un error cabal en Hackage trac. Creo que es lo suficientemente claro para mí que el mensaje realmente no describe el problema adecuadamente. – fatuhoku

3

utilizar el tipo de construcción Configure en su archivo $PROJ_NAME.cabal y generar un archivo $PROJ_NAME.buidinfo partir de una plantilla $PROJ_NAME.buildinfo.in con un guión configure. Mira la fuente de la biblioteca SDL en Hackage para ver un ejemplo. This section de la guía de usuario de Cabal proporciona más detalles.

Un consejo: no olvide mencionar $PROJ_NAME.buildinfo.in y configure en el campo extra-source-files.

Cuestiones relacionadas