haskell linker cabal ffi

¿Cómo vincular el archivo objeto personalizado con la biblioteca Haskell?



linker cabal (1)

He creado un paquete de Haskell que realiza llamadas FFI a funciones definidas en el código CUDA. Me gustaría compilar el archivo .cu en un archivo objeto (.o) durante la compilación del paquete y forzar al vinculador para que lo vincule.

Hasta ahora, traté de usar una técnica encontré esta pregunta . He personalizado buildHook para:

  1. ejecutar nvcc
  2. ejecutar por defecto buildHook
  3. crear un archivo de biblioteca ar con código compilado nvcc.

Setup.hs está disponible here .

Esta solución tiene una gran desventaja al restringir este paquete a la vinculación estática. Aunque cabal produce una biblioteca compartida, no funcionará porque no tiene forma de resolver los símbolos ubicados en el archivo objeto.

¿Hay una forma más sencilla de vincular el código personalizado durante la construcción?


Hago algo similar. Tengo un archivo de Haskell que llama al código CUDA.

Así es como compilo las bibliotecas CUDA y me vinculo con Haskell:

$(NVCC) -c -E $(NVCC_OPTS) -o build/file.i file.cu $(NVCC) -c $(NVCC_OPTS) -o build/file.o file.cu

Luego vinculo todo en una biblioteca compartida de C ++ llamada LibSO con opciones de Haskell

$(CXX) -shared -Wl,-rpath=/$$$$ORIGIN $(CXX_LINK_LIBS) $(PACKAGE_RPATH) -Lbuild -rdynamic -L/usr/local/lib/ghc-7.6.3 -lHSrts-ghc7.6.3 -o build/LibSO.so build/file.o

dónde

CXX_LINK_LIBS = -Lbuild -lcudart -lcuda -lpthread -lcupti -lcurand -lnvidia-ml NVCC_OPTS = --compiler-options -fPIC -maxrregcount=0 --machine 64 --DCUDA

Luego tomo mis archivos Haskell y los compilo en archivos o y hi. (Compilo dos veces debido a TemplateHaskell)

ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main -o build/iop.o -ohi build/iop.hi -c haskell/iop.lhs ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main -fPIC -dynamic -osuf dyn_o -hisuf dyn_hi -o build/iop.dyn_o -ohi build/iop.dyn_hi -c haskell/iop.lhs

Así que ahora tenemos objetos dinámicos de haskell y una biblioteca compartida de C ++. Al final, vinculo un archivo haskell principal con todo:

ghc -optl "-Wl,-rpath=/$$ORIGIN" $(CXX_LINK_LIBS) -Lbuild -rtsopts -threaded -lstdc++ -lLibSO -o build/Main build/iop.dyn_o

¿Este tipo de ayuda?