2011-02-10 7 views
13

Mantengo una biblioteca con enlaces FFI en Hackage. Así que mi biblioteca Haskell depende de la biblioteca C correspondiente y sus archivos de encabezado. Ahora se especifica la dependencia externa en el archivo .cabal así:¿Cómo se especifica la dependencia de la biblioteca C externa en .cabal?

PkgConfig-Depends: 
     libfoo >= 1.2 

y funciona bien para mí en Linux. Sin embargo, tengo un usuario de la biblioteca que se informa, que la instalación de pkg-config en Windows es bastante engorroso, y en su lugar prefiere

Includes: 
     foo.h 
Extra-libraries: 
     foo 

Me gustaría que mi biblioteca para ser tan fácil de construir como sea posible, y don' Quiero forzar las dependencias de compilación que no son estrictamente necesarias. Sin embargo, veo que Cabal manual sugiere usar PkgConfig-Depends.

Mis preguntas:

  • Qué camino yo preferiría paquetes de plataforma cruzada?
  • ¿Es posible escribir un archivo .cabal de tal manera que funcione con pkg-config y sin él?
  • Y, dicho sea de paso, está incluido pkg-config en la plataforma Haskell (no tengo una máquina con Windows para verificar en este momento)?
+3

pkg-config no está incluido con la plataforma en Windows (2010.2.0.0). –

+0

gracias, @Stephen. – sastanin

Respuesta

12

El método pkg-config es preferible porque pkg-config sabe dónde encontrar los archivos include y library, que pueden estar en ubicaciones no estándar en algunos sistemas.

Puede escribir el archivo .cabal para usar ambos métodos. Usar una bandera, como se muestra aquí, tiene la ventaja de que Cabal automáticamente probará el otro valor de indicador si falla el predeterminado. (El ejemplo siguiente no se ha probado)

Flag UsePkgConfig 
    Description: Use pkg-config to check for library dependences 
    Default: True 

Executable hax 
    if flag(UsePkgConfig) 
    PkgConfig-Depends: libfoo >= 1.2 
    else 
    Includes: foo.h 
    Extra-libraries: foo 
+0

Gracias. Elegí este enfoque con una bandera, por desgracia prefiero la bandera 'NoPkgConfig', porque' cabal configure -fNoPkgConfig' es más legible que 'cabal configure -f-UsePkgConfig'. Este enfoque funciona bien en Linux (con y sin 'pkg-config' instalado).Informaré cuál es la opinión de los usuarios de Windows más adelante. – sastanin

+0

Actualización: este enfoque también funciona en Windows. – sastanin

5

pkg-config no está incluido en la plataforma Haskell, ni podría imaginar que alguna vez lo sea.

Normalmente usaré includes/Extra-libraries si son relativamente simples. Pero para los paquetes complejos que pueden tener muchas bibliotecas incluidas, como gtk, es mucho mejor usar pkg-config cuando esté disponible.

Es posible escribir un archivo .cabal que funcione con y sin campos específicos. Prueba esto:

if os(windows) 
    Includes: 
     foo.h 
    Extra-libraries: 
     foo 
else 
    PkgConfig-Depends: 
     libfoo >= 1.2 

También tenga en cuenta que .cabal puede ejecutar un script de configuración, que puede ayudar en algunas situaciones, pero no es muy ventanas de usar.

+0

Gracias. Consideré hacer algo como esto, pero probablemente la solución propuesta por @Heatsink es más flexible. Voy a probar eso primero. – sastanin

+2

@jetxee: es cierto que las banderas pueden ser más flexibles, pero también pueden causar problemas. Parece que Cabal desea recompilar paquetes ya instalados cuando se genera un nuevo paquete con un conjunto diferente de indicadores, lo que puede poner su paquete db en un estado incoherente. Puede que sea parcial porque simplemente tuve que arreglar mi paquete db. –

Cuestiones relacionadas