Personal tools

Cabal

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Link to installation page)
(Information for package users: Added a link to 'Haskell Best Practices for Avoiding "Cabal Hell"')
 
(24 intermediate revisions by 7 users not shown)
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 ==
 
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.
+
== Summary ==
  +
* Cabal is a package and build system. Cabal is only involved in the creation of packages and the building of their contents. It does not manage packages.
  +
* Cabal-Install installs cabal packages. It is distinct from Cabal (the build system). This often confuses new users. Furthermore, Cabal-Install is not a fully featured package manager. For example, it cannot install non cabal packaged dependencies, it cannot uninstall packages, nor can it automatically upgrade installations.
   
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.
+
== Information for package users ==
  +
*[http://dev.stephendiehl.com/hask/#cabal An introduction to cabal-install]
  +
*[[Cabal/Survival | A short and transient survival guide for Cabal users]]
  +
*[[Cabal/How to install a Cabal package | How to install a Cabal package]]
  +
*[http://coldwa.st/e/blog/2013-08-20-Cabal-sandbox.html An Introduction to Cabal sandboxes]
  +
*[[Cabal/FAQ|FAQ: Frequently Asked Questions]]
  +
*[[Cabal-Install]] - tool that greatly simplifies installation of Cabal packages
  +
*[http://hackage.haskell.org/package/cabal-sort Cabal-Sort] - assistance with compilation of multiple cabal packages
  +
*[[CabalFind]] - finding Cabal packages on the web (now superseded by [http://hackage.haskell.org/ Hackage])
  +
* [http://www.vex.net/~trebla/haskell/sicp.xhtml Storage and Identification of Cabalized Packages]
  +
* [http://hackage.haskell.org/package/cabal-dev cabal-dev], a tool for managing development builds of Haskell projects. It supports maintaining sandboxed cabal-install repositories, and sandboxed ghc package databases. See [http://www.reddit.com/r/haskell/comments/f3ykj/psa_use_cabaldev_to_solve_dependency_problems/ PSA: Use cabal-dev to solve dependency problems] for an extensive description.
  +
* Blog article: [http://ivanmiljenovic.wordpress.com/2010/03/15/repeat-after-me-cabal-is-not-a-package-manager/ Repeat after me: “Cabal is not a Package Manager”]
  +
* [http://www.mew.org/~kazu/proj/cab/en/ cab], a maintenance command of Haskell cabal packages
  +
* Blog article: [http://softwaresimply.blogspot.fr/2014/07/haskell-best-practices-for-avoiding.html Haskell Best Practices for Avoiding "Cabal Hell"]
   
<haskell>
+
== Information for package developers ==
#! /usr/bin/runghc
+
*[[How to write a Haskell program]]
+
*[http://wewantarock.wordpress.com/2010/11/03/building-a-shared-library-in-cabal/ Building a shared library in Cabal]
> import Distribution.Simple
+
*[[Cabal/Developer-FAQ|FAQ: Frequently Asked Questions of package authors]]
> import Distribution.Simple.LocalBuildInfo
+
*[[Cabal/How to install a Cabal package remotely | How to install a Cabal package remotely]]
> import Distribution.PackageDescription
+
*[[Upgrading packages]]
> import System.Cmd
+
*[[Package versioning policy]]
> import System.Directory
+
*[[Creating Debian packages from Cabal package]]
> import Data.List
+
*[http://neilmitchell.blogspot.com/2008/02/adding-data-files-using-cabal.html Adding data files using Cabal]
>
+
*[http://www.moonloop.net/haskell/docs/cbs-custom.html Cabal Setup file examples]
>
+
*[[Cabal-make]] - automation based on makefiles
> main = defaultMainWithHooks (defaultUserHooks { postBuild = buildDll })
+
*[http://blog.ezyang.com/2010/06/setting-up-cabal-the-ffi-and-c2hs/ Setting up Cabal, the FFI and c2hs]
> 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]]
  +
[[Category:Cabal]]

Latest revision as of 22:37, 31 July 2014

The Haskell Cabal:

The Common Architecture for Building Applications and Libraries

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

[edit] 1 Summary

  • Cabal is a package and build system. Cabal is only involved in the creation of packages and the building of their contents. It does not manage packages.
  • Cabal-Install installs cabal packages. It is distinct from Cabal (the build system). This often confuses new users. Furthermore, Cabal-Install is not a fully featured package manager. For example, it cannot install non cabal packaged dependencies, it cannot uninstall packages, nor can it automatically upgrade installations.

[edit] 2 Information for package users

[edit] 3 Information for package developers