2011-03-18 16 views
11

Bir uygulamayı GHC API'sine erişmesi gereken Windows'a dağıtmak istiyorum. Wiki ilk basit örneği kullanarak: Aşağıdaki hataWindows için dağıtılmış uygulama için GHC API'sine sahip olmanın basit yolu

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

sonuçları (başka temiz pencerelerde yüklemek haskell platformuyla bir makinede derlenen ve idam): test.exe: Bir bulamıyor paket veritabanı C: \ haskell \ lib \ package.conf.d

Uygulamamı basit bir zip dosyası olarak dağıtmak ve kullanıcının yüklü bir öğeye sahip olmasını gerektirmez. Gerekli olan GHC şeylerini bu zip dosyasına dahil etmenin kolay bir yolu var mı?

+0

"libdir" yerine "package.conf.d" yolunu manuel olarak belirtebilirsiniz. '' runGhc (Just "yol \ to \ ghc \ lib") ' –

+0

Teşekkürler, ama benim soru, windows'umdaki uygulamada en az ghc gömülmesinin nasıl gerçekleştirileceğiyle ilgili daha sonra bahsi geçen belirli hata. – mentics

+0

Bu durumda aslında sorunun ne olduğunu anlamıyorum. Görünüşe göre, sadece lib ve libing'i fermuarınıza kopyalamanız ve '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '{} {} {} {}). –

cevap

2

Bu program (sadece pencerelerin üzerinde çalışacak) belirtilen dizine gerekli dosyaları kopyalar:

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' 

argüman olarak hedef dizine ile çalıştırdıktan sonra lib ve mingw (yaklaşık 300 yerel bir kopyasını sahip olacak Toplam Mb).

Kullanılmayan kitaplıkları daha fazla alan kazanmak için lib'dan kaldırabilirsiniz.

İlgili konular