2011-03-18 15 views
11

Quiero implementar una aplicación en Windows que necesite acceder a la API de GHC. Usando el primer ejemplo sencillo de la Wiki:Manera simple de tener la API de GHC para la aplicación implementada en Windows

http://www.haskell.org/haskellwiki/GHC/As_a_library

resultados en el siguiente error (compilado en una máquina con la plataforma Haskell y ejecutada en otro ventanas instalación limpia): test.exe: no se puede encontrar una base de datos de paquetes en C: \ haskell \ lib \ package.conf.d

Me gustaría implementar mi aplicación como un simple archivo zip y no requerir que el usuario tenga algo instalado. ¿Existe alguna manera directa de incluir las cosas necesarias de GHC en ese archivo comprimido para que funcione?

+0

puede especificar manualmente la ruta a 'package.conf.d' en lugar de llamar a' libdir'. es decir 'runGhc (solo" ruta \ a \ ghc \ lib ")' –

+0

Gracias, pero mi pregunta es más acerca de cómo lograr una incrustación mínima de ghc en mi aplicación en Windows, entonces el error específico mencionado. – mentics

+0

En ese caso, no entiendo cuál es el problema en realidad. Parece que solo necesitas copiar 'lib' y' mingw' en tu zip y proporcionar 'runGhc' con una ruta relativa a esta' lib' (y no olvides eliminar los paquetes y bibliotecas no utilizados con información de perfil de 'lib') –

Respuesta

2

Este programa copiará los archivos necesarios en el directorio especificado (sólo funcionará en Windows):

import Data.List (isSuffixOf) 
import System.Environment (getArgs) 
import GHC.Paths (libdir) 
import System.Directory 
import System.FilePath 
import System.Cmd 

main = do 
    [to] <- getArgs 
    let libdir' = to </> "lib" 
    createDirectoryIfMissing True libdir' 
    copy libdir libdir' 
    rawSystem "xcopy" 
    [ "/e", "/q" 
    , dropFileName libdir </> "mingw" 
    , to </> "mingw\\"] 


-- | skip some files while copying 
uselessFile f 
    = or $ map (`isSuffixOf` f) 
    [ "." 
    , "_debug.a" 
    , "_p.a", ".p_hi" -- libraries built with profiling 
    , ".dyn_hi", ".dll"] -- dynamic libraries 


copy from to 
    = getDirectoryContents from 
    >>= mapM_ copy' . filter (not . uselessFile) 
    where 
    copy' f = do 
     let (from', to') = (from </> f, to </> f) 
     isDir <- doesDirectoryExist from' 
     if isDir 
      then createDirectory to' >> copy from' to' 
      else copyFile from' to' 

Después de ejecutarlo con el directorio de destino como argumento que tendrá una copia local de lib y mingw (aproximadamente 300 Mb total).

Puede eliminar bibliotecas no utilizadas de lib para ahorrar más espacio.

Cuestiones relacionadas