Cabal
From HaskellWiki
(link to Cabal-Install) |
m (separate related tools from main info for developers) |
||
| Line 14: | Line 14: | ||
*[[Package versioning policy]] | *[[Package versioning policy]] | ||
*[[Creating Debian packages from Cabal package]] | *[[Creating Debian packages from Cabal package]] | ||
| - | *[[CabalFind]] | + | |
| - | *[[Cabal-make]] | + | === Related contributed tools === |
| + | |||
| + | *[[CabalFind]] - finding Cabal packages on the web (now superseded by [http://hackage.haskell.org/ Hackage]) | ||
| + | *[[Cabal-make]] - automation based on makefiles | ||
== Building Dlls on Windows with Cabal == | == Building Dlls on Windows with Cabal == | ||
Revision as of 11:20, 6 March 2009
The Haskell Cabal:
- The Common Architecture for Building Applications and Libraries
Contents |
1 Information for users
- How to install a Cabal package
- FAQ: Frequently Asked Questions
- Cabal-Install - tool that greatly simplifies installation of Cabal packages
2 Information for developers
- How to write a Haskell program
- Upgrading packages
- Package versioning policy
- Creating Debian packages from Cabal package
2.1 Related contributed tools
- CabalFind - finding Cabal packages on the web (now superseded by Hackage)
- Cabal-make - automation based on makefiles
3 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"
