2014-06-27 11 views
6

Mam bibliotekę C "myboo", która ma plik Makefile. Chcę utworzyć opakowanie tej biblioteki. Nie chcę instalować go w/usr/local, ponieważ "myboo" nie jest głównym modułem. Dodatkowo zaleca się, aby budować "myboo" nie jako bibliotekę dynamiczną, ale jako bibliotekę statyczną.Użyj względnych ścieżek dla dodatkowych bibliotek-lib na kablu

Wykonuję niestandardowy plik Setup.py, aby zbudować "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"] 

I rozmieszczam plik myboo.cabal w celu połączenia moich kodów haskell z biblioteką C;

library 
    exposed-modules:  MyBoo 
    build-depends:  base >=4.7 && <4.8 
    hs-source-dirs:  src 
    default-language: Haskell2010 
    include-dirs: myboo 
    extra-libraries: myboo 
    extra-lib-dirs: myboo 

Po uruchomieniu "kompilacji kabalowej" otrzymuję wiadomości.

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) 

Jeśli napiszę "ekstra-lib-katalogi:/absolutna/ścieżka/do/pracy/dir/myboo", wydaje się, że działa dobrze. Ale to nie jest dobra droga, ponieważ/absolute/... jest po prostu katalogiem roboczym.

Jak naprawić powyższe komunikaty o błędach? Moje środowisko jest tutaj;

% 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" 

Odpowiedz

7

Możesz napisać własne Setup.hs i skonfigurować Distribution.Simple.confHook. W funkcji przechwytywania zmień Distribution.PackageDescription.extraLibDirs, aby uwzględnić katalog.

Pamiętaj, że musisz również zmienić plik build-type na Custom w swoim pliku cabal.

Oto link do Setup.hs, w którym zrobiłem to, co napisałem.

0

Trochę późno, ale ...

Teraz można użyć ścieżki względnej ustawić extra-include-dirs i extra-lib-dirs opcje w stack.yaml. Na przykład, dla jakiegoś pakietu A, to będzie wyglądać następująco:

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

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

zakładając zarówno A i my-c-lib są zapisane w tym samym folderze.

To wszystko. Nie wymaga ustawienia zmiennej LD_LIBRARY_PATH (dopóki nie uruchomisz pliku wykonywalnego). Ale jeśli masz pakiet B, który używa A, musisz dodać A 's extra-..-dirs do B' s stack.yaml. W przeciwnym razie pojawi się błąd Missing C library. Również tutaj musi być ustawiony LD_LIBRARY_PATH, aby zapobiec błędowi can't load .so/.DLL podczas budowania w .

Zasadniczo jest to obejście dla budowania pakietów lokalnych. Nie użyłbym go do pakietu publicznego, ponieważ zmusza on użytkownika do zmodyfikowania stack.yaml lub do przechowywania pakietów zależności w tym samym folderze.