Cabal
From HaskellWiki
(Added a link to "How to write a Haskell program") |
(link to Cabal-Install) |
||
| Line 7: | Line 7: | ||
*[[Cabal/How to install a Cabal package | How to install a Cabal package]] | *[[Cabal/How to install a Cabal package | How to install a Cabal package]] | ||
*[[Cabal/FAQ|FAQ: Frequently Asked Questions]] | *[[Cabal/FAQ|FAQ: Frequently Asked Questions]] | ||
| + | *[[Cabal-Install]] - tool that greatly simplifies installation of Cabal packages | ||
== Information for developers == | == Information for developers == | ||
Revision as of 14:38, 20 January 2009
The Haskell Cabal:
- The Common Architecture for Building Applications and Libraries
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
- CabalFind
- Cabal-make
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"
