During the Hackathon in Edinburgh last year, Benedikt Huber and I worked hard on adding a new feature to cabal-install. It eventually made its way into the codebase and has now been a part of cabal-install since version 0.8.0. However, it seems that lots of people still don’t know about it, so I thought I’d write a quick post about it.

What do you do when you want to create a new Cabalized package? If you’re like me, in the past you’ve probably copy-and-pasted the .cabal file from a different project and edited it. And the first .cabal file you ever made, you probably copy-and-pasted from someone else’s project. This works fine up to a point, but it’s annoying, and you never end up learning about great new features that Cabal now supports, or about things you’ve been doing that are now deprecated. Wouldn’t it be great if the initial setup for a Cabal project could be generated for you?

The solution is a new mode for the cabal command line tool, cabal init , which interactively prompts you for some information and creates a default .cabal file and related package stuff for you. Without further ado, let’s see it in action!

$ mkdir myproject $ cd myproject $ cat > Foo.hs module Foo where x = 3

This is going to be the best package ever!

$ cabal init Package name [default "myproject"]? Package version [default "0.1"]? Please choose a license: 1) GPL 2) GPL-2 3) GPL-3 4) LGPL 5) LGPL-2.1 6) LGPL-3 * 7) BSD3 8) BSD4 9) MIT 10) PublicDomain 11) AllRightsReserved 12) OtherLicense 13) Other (specify) Your choice [default "BSD3"]? Author name [default "Brent Yorgey"]? Maintainer email [default "byorgey@cis.upenn.edu"]? Project homepage/repo URL? http://best.project.evar/ Project synopsis? The best package ever! Defines 3 so you don't have to. Project stability: 1) Stable 2) Provisional * 3) Experimental 4) Alpha 5) Other (specify) Your choice [default "Experimental"]? Project category: 1) Codec 2) Concurrency 3) Control 4) Data 5) Database 6) Development 7) Distribution 8) Game 9) Graphics 10) Language 11) Math 12) Network 13) Sound 14) System 15) Testing 16) Text 17) Web 18) Other (specify) Your choice? 11 What does the package build: 1) Library 2) Executable Your choice? 1 Generating LICENSE... Generating Setup.hs... Generating myproject.cabal... You may want to edit the .cabal file and add a Description field.

Notice how it automatically guessed the project name and my name and email. (Actually, I’m not even sure how it did that! Fancy!) And here’s what it generated. Notice that the module Foo is listed as an export; it automatically looks through the current directory and any subdirectories for things that look like modules to be exported.

$ cat myproject.cabal -- myproject.cabal auto-generated by cabal init. For additional -- options, see -- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr. -- The name of the package. Name: myproject -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented. Version: 0.1 -- A short (one-line) description of the package. Synopsis: The best package ever! Defines 3 so you don't have to. -- A longer description of the package. -- Description: -- URL for the project homepage or repository. Homepage: http://best.project.evar/ -- The license under which the package is released. License: BSD3 -- The file containing the license text. License-file: LICENSE -- The package author(s). Author: Brent Yorgey -- An email address to which users can send suggestions, bug reports, -- and patches. Maintainer: byorgey@cis.upenn.edu -- A copyright notice. -- Copyright: -- Stability of the pakcage (experimental, provisional, stable...) Stability: Experimental Category: Math Build-type: Simple -- Extra files to be distributed with the package, such as examples or -- a README. -- Extra-source-files: -- Constraint on the version of Cabal needed to build this package. Cabal-version: >=1.2 Library -- Modules exported by the library. Exposed-modules: Foo -- Packages needed in order to build this package. -- Build-depends: -- Modules not exported by this package. -- Other-modules: -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source. -- Build-tools:

Notice that all the fields are commented so you know what they are for, and why you might want to edit them later. For power users who don’t want all the comments there are the --noComments and --minimal flags; consult cabal init --help for a full list of options.

Even in making this post I thought of a bunch of things that could be improved, so there’s still work to be done, but I think it’s quite usable in its current state! Give it a try and let me know of any bugs or feature requests!