Domanda

Voglio distribuire un'applicazione su Windows che deve accedere all'API GHC. Usando il primo semplice esempio dal wiki:

http://www.haskell.org/haskellwiki/ghc/as_a_library

Risultati nel seguente errore (compilato su una macchina con piattaforma Haskell ed eseguita su un'altra installazione di Windows Clean): Test.exe: Impossibile trovare un database del pacchetto su C: Haskell lib pack.conf.d

Vorrei distribuire la mia applicazione come semplice file zip e non richiedere all'utente di avere qualcosa di installato. Esiste un modo semplice per includere le cose GHC necessarie in quel file zip in modo che funzioni?

È stato utile?

Soluzione

Questo programma copierà i file necessari nella directory specificata (funzionerà solo su 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'

Dopo averlo eseguito con la directory di destinazione come argomento, avrai una copia locale di lib e mingw (circa 300 MB in totale).

Puoi rimuovere le librerie inutilizzate da lib Per risparmiare più spazio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top