Personal tools

Cabal

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Added link "Cabal Setup file examples")
(move DLL hints to Developer-FAQ)
Line 11: Line 11:
== Information for developers ==
== Information for developers ==
*[[How to write a Haskell program]]
*[[How to write a Haskell program]]
 +
*[[Cabal/Developer-FAQ|FAQ: Frequently Asked Questions of package authors]]
*[[Upgrading packages]]
*[[Upgrading packages]]
*[[Package versioning policy]]
*[[Package versioning policy]]
Line 21: Line 22:
*[[CabalFind]] - finding Cabal packages on the web (now superseded by [http://hackage.haskell.org/ Hackage])
*[[CabalFind]] - finding Cabal packages on the web (now superseded by [http://hackage.haskell.org/ Hackage])
*[[Cabal-make]] - automation based on makefiles
*[[Cabal-make]] - automation based on makefiles
-
 
-
== 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 <tt>cmd</tt> to take this into account. Another possible addition is specifying a static dll. Check the ghc manual above.
 
-
 
-
<haskell>
 
-
#! /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"
 
-
</haskell>
 
[[Category:Tools]]
[[Category:Tools]]

Revision as of 08:14, 13 May 2010

The Haskell Cabal:

The Common Architecture for Building Applications and Libraries

http://www.haskell.org/cabal/

1 Information for users

2 Information for developers

2.1 Related contributed tools