Простой способ иметь GHC API для приложения, развернутого в Windows - PullRequest
11 голосов
/ 18 марта 2011

Я хочу развернуть приложение в Windows, которому требуется доступ к GHC API.Использование первого простого примера из вики:

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

приводит к следующей ошибке (скомпилированной на одной машине с платформой haskell и выполненной на другой чистой установке Windows): test.exe:не могу найти базу данных пакетов в C: \ haskell \ lib \ package.conf.d

Я бы хотел развернуть свое приложение в виде простого zip-файла и не требовать от пользователя установки чего-либо.Есть ли простой способ включить необходимые файлы GHC в этот zip-файл, чтобы он работал?

1 Ответ

2 голосов
/ 31 марта 2011

Эта программа скопирует необходимые файлы в указанную директорию (будет работать только на окнах):

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'

После запуска с целевым каталогом в качестве аргумента у вас будет локальная копия lib и mingw (всего около 300 МБ).

Вы можете удалить неиспользуемые библиотеки из lib, чтобы сэкономить больше места.

...