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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top