Maneira simples de ter a API GHC para aplicativo implantado no Windows
-
27-10-2019 - |
Pergunta
Quero implantar um aplicativo no Windows que precisa acessar a API GHC.Usando o primeiro exemplo simples do Wiki:
http://www.haskell.org/haskellwiki/GHC/As_a_library
resulta no seguinte erro (compilado em uma máquina com plataforma haskell e executado em outra instalação limpa do Windows): test.exe: não é possível encontrar um banco de dados de pacote em C: \ haskell \ lib \ package.conf.d
Eu gostaria de implantar meu aplicativo como um arquivo zip simples e não exigir que o usuário tenha nada instalado.Existe uma maneira direta de incluir as coisas do GHC necessárias naquele arquivo zip para que funcione?
Solução
Este programa irá copiar os arquivos necessários para o diretório especificado (funcionará apenas no 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'
Depois de executá-lo com o diretório de destino como argumento, você terá uma cópia local de lib
e mingw
(cerca de 300 Mb no total).
Você pode remover bibliotecas não utilizadas de lib
para economizar mais espaço.