Cabal
From HaskellWiki
m (Timewasting prettying :)) |
(Link to installation page) |
||
| Line 3: | Line 3: | ||
http://www.haskell.org/cabal/ | http://www.haskell.org/cabal/ | ||
| - | + | ==Hints, tips and other suggestions == | |
| + | *[[Cabal/How to install a Cabal package | Installation tips]] | ||
== Building Dlls on Windows with Cabal == | == Building Dlls on Windows with Cabal == | ||
Cabal does not currently support building dlls on windows out of the box. Some details about why can be found here: | Cabal does not currently support building dlls on windows out of the box. Some details about why can be found here: | ||
Revision as of 18:24, 15 February 2007
The Haskell Cabal:
- The Common Architecture for Building Applications and Libraries
1 Hints, tips and other suggestions
2 Building Dlls on Windows with Cabal
Cabal does not currently support building dlls on windows out of the box. Some details about why can be found here: http://www.haskell.org/ghc/docs/6.4.2/html/users_guide/packages.html http://www.haskell.org/ghc/docs/6.4.2/html/users_guide/win32-dlls.html
This means that we have to do a bit of hackery to get Cabal to build a dll from a library. As long as we build a single DLL from the entire project the dll should behave as expected. Using the Setup.lhs listed below and following the directions listed above (the second link) I was able to use Visual Haskell to build a dll which I could load into Visual Basic for testing.
The following Setup.lhs should do the trick for most projects which consist of a single library which needs to be built as a dll. If you need to specify a dll export file you'll need to modify the function cmd to take this into account. Another possible addition is specifying a static dll. Check the ghc manual above.
#! /usr/bin/runghc > import Distribution.Simple > import Distribution.Simple.LocalBuildInfo > import Distribution.PackageDescription > import System.Cmd > import System.Directory > import Data.List > > > main = defaultMainWithHooks (defaultUserHooks { postBuild = buildDll }) > where > buildDll _ _ pkg info = do putStrLn "Building Dll..." > setCurrentDirectory (buildDir info) > let buildCmd = cmd pkg info > putStrLn buildCmd > system buildCmd > let dll = dllFile pkg > let cpDllCmd = "cp " ++ dll ++ " " ++ (name pkg) ++ "\\" ++ dll > putStrLn cpDllCmd > system cpDllCmd > ghcExe :: LocalBuildInfo -> String > ghcExe info = "\"" ++ (compilerPath (compiler info)) ++ "\"" > mainOFile :: PackageDescription -> String > mainOFile pd = "HS" ++ (name pd) ++ "-" ++ (showVersion (pkgVersion (package pd))) ++ ".o" > cmd :: PackageDescription -> LocalBuildInfo -> String > cmd pd i = (ghcExe i) ++ " --mk-dll -o " ++ (dllFile pd) ++ " " ++ (mainOFile pd) ++ " " ++ (packages i) > packages :: LocalBuildInfo -> String > packages i = foldl1 (\x y -> x ++ " " ++ y) (map showPackage (packageDeps i)) > showPackage :: PackageIdentifier -> String > showPackage pi = "-package " ++ showPackageId pi > name :: PackageDescription -> String > name = pkgName . package > dllFile :: PackageDescription -> String > dllFile pd = (name pd) ++ ".dll"
