2011-02-10 10 views
13

Gestisco una libreria con binding FFI su Hackage. Quindi la mia libreria Haskell dipende dalla libreria C corrispondente e dai suoi file di intestazione. Ora ho specificare la dipendenza esterna nel file .cabal in questo modo:Come specificare la dipendenza dalla libreria C esterna in .cabal?

PkgConfig-Depends: 
     libfoo >= 1.2 

e funziona bene per me in Linux. Tuttavia, ho un utente della biblioteca che riferisce, che l'installazione di pkg-config su Windows è piuttosto ingombrante, e invece preferisce

Includes: 
     foo.h 
Extra-libraries: 
     foo 

vorrei la mia libreria di essere il più facile da costruire il più possibile, e don' t voglio forzare le dipendenze di build che non sono strettamente richieste. Tuttavia, vedo che Cabal manual suggerisce di utilizzare PkgConfig-Depends.

Le mie domande:

  • che parte dovrei preferire per i pacchetti multi-piattaforma?
  • È possibile scrivere un file .cabal in modo che possa funzionare con pkg-config e senza?
  • E, a proposito, è pkg-config incluso nella piattaforma Haskell (non ho una macchina Windows da verificare adesso)?
+3

pkg-config non è incluso con la piattaforma su Windows (2010.2.0.0). –

+0

grazie, @Stephen. – sastanin

risposta

12

Il metodo pkg-config è preferibile perché pkg-config sa dove trovare i file include e library, che possono trovarsi in posizioni non standard su alcuni sistemi.

È possibile scrivere il file .cabal per utilizzare entrambi i metodi. Usando un flag, come mostrato qui, ha il vantaggio che Cabal proverà automaticamente l'altro valore di flag se fallisce l'impostazione predefinita. (Sotto l'esempio non viene testato)

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

Grazie. Ho scelto questo approccio con una bandiera, ma ho preferito il flag "NoPkgConfig", perché "cabal configure -fNoPkgConfig" è più leggibile di "cabal configure -f-UsePkgConfig'. Questo approccio funziona bene su Linux (con e senza 'pkg-config' installato).Segnalerò qual è il feedback degli utenti di Windows più tardi. Aggiornamento – sastanin

+0

: questo approccio funziona bene anche su Windows. – sastanin

5

pkg-config non è incluso nella piattaforma Haskell, né potrei immaginare che sarebbe mai stato.

Solitamente userò includes/Extra-libraries se sono relativamente semplici. Ma per pacchetti complessi che possono avere molte librerie incluse, come gtk, è molto più bello usare pkg-config quando è disponibile.

È possibile scrivere un file cab che funziona con e senza campi specifici. Prova questo:

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

Si noti inoltre che .cabal possibile eseguire uno script di configurazione, che può aiutare in alcune situazioni, ma non è molto finestre-friendly.

+0

Grazie. Ho pensato di fare qualcosa di simile, ma probabilmente la soluzione proposta da @Heatsink è più flessibile. Proverò prima questo. – sastanin

+2

@jetxee: è vero che le bandiere possono essere più flessibili, ma possono anche causare problemi. La cabala sembra voler ricompilare i pacchetti già installati quando un nuovo pacchetto viene creato con un diverso set di flag, che può mettere il pacchetto db in uno stato incoerente. Potrei essere di parte perché ho appena dovuto risolvere il mio pacchetto db però. –