Forma simple de tener la API GHC para la aplicación implementada en Windows
-
27-10-2019 - |
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?
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.