2014-06-27 3 views
6

Ho una libreria C "myboo" che ha Makefile. Voglio fare un wrapper di questa libreria. Non voglio installarlo in/usr/local dato che "myboo" non è un modulo principale. Inoltre, si consiglia di creare "myboo" non come libreria dinamica ma come libreria statica.Usa percorsi relativi per extra-lib-dirs sulla cabala

Faccio Setup.py personalizzato per creare "myboo";

main :: IO() 
main = defaultMainWithHooks simpleUserHooks { 
      preBuild = \a b -> makeLib a b >> preBuild simpleUserHooks a b 
      } 

makeLib :: Args -> BuildFlags -> IO() 
makeLib _ flags = do 
    let verbosity = fromFlag $ buildVerbosity flags 
    cflags <- lookupEnv "CFLAGS" >>= return . maybe "" id 
    setEnv "CFLAGS" $ "-fPIC" ++ (' ' : cflags) 
    rawSystemExit verbosity "env" ["make", "--directory=myboo", "libmyboo.a"] 

E ho organizzato myboo.cabal per collegare i miei codici haskell alla libreria C;

Quando eseguo "cabal build", ho ricevuto i seguenti messaggi.

myboo-0.1.0.0: library-dirs: myboo is a relative path which makes no sense (as 
there is nothing for it to be relative to). You can make paths relative to the 
package database itself by using ${pkgroot}. (use --force to override) 

Se scrivo "extra-lib-dirs:/assoluto/path/to/lavoro/dir/myboo", sembra che funziona bene. Ma non è un buon modo perché/absolute/... è solo una directory di lavoro.

Come devo risolvere i messaggi di errore sopra? Il mio ambiente è qui;

% ghc --version 
The Glorious Glasgow Haskell Compilation System, version 7.8.2 
% cabal --version 
cabal-install version 1.20.0.2 
using version 1.20.0.0 of the Cabal library 
% cat /etc/lsb-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=14.04 
DISTRIB_CODENAME=trusty 
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS" 

risposta

7

È possibile scrivere il proprio Setup.hs e impostare Distribution.Simple.confHook. Nella funzione gancio, modificare Distribution.PackageDescription.extraLibDirs per includere la directory.

Nota che è inoltre necessario modificare build-type in Custom nel file cabal.

Ecco un collegamento a Setup.hs in cui ho fatto ciò che ho scritto.

0

Un po 'in ritardo, ma ...

ora che è possibile utilizzare percorso relativo per impostare extra-include-dirs e extra-lib-dirs opzioni in stack.yaml. Ad esempio, per qualche pacchetto A, sarebbe simile a questa:

extra-include-dirs: 
- ../my-c-lib/src 

extra-lib-dirs: 
- ../my-c-lib/build 

assumendo sia A e my-c-lib sono memorizzati nella stessa cartella.

Questo è tutto. Non richiede di impostare la variabile LD_LIBRARY_PATH (finché non si esegue eseguibile). Ma, se si dispone di un pacchetto B che utilizza A, è necessario aggiungere extra-..-dirs a BBstack.yaml. Altrimenti ti verrà visualizzato l'errore Missing C library. Inoltre, è necessario impostare LD_LIBRARY_PATH per impedire l'errore can't load .so/.DLL durante l'edificio di B.

Fondamentalmente è una soluzione alternativa per la creazione di pacchetti locali. Non lo userei per pacchetto pubblico perché obbliga un utente a modificare stack.yaml oa memorizzare i pacchetti dipendenti nella stessa cartella.