Pregunta

Quiero implementar una aplicación en Windows que necesite acceder a la API de GHC. Usando el primer ejemplo simple del wiki:

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 otra instalación de Windows limpio): test.exe: No se puede encontrar una base de datos de paquete en C: Haskell lib paquete.conf.d

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

¿Fue útil?

Solución

Este programa copiará los archivos necesarios al directorio especificado (funcionará solo 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, tendrá una copia local de lib y mingw (alrededor de 300 MB en total).

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top