├── .github └── CODEOWNERS ├── CONTRIBUTING.md ├── LICENSE └── README.md /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @chshersh @vrom911 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guide 2 | 3 | ## :wave: Greetings Traveler! 4 | 5 | We are delighted that you are reading this, and we appreciate the 6 | effort you are taking to make this repository even more awesome! 7 | :sunglasses: 8 | 9 | ## How to contribute 10 | 11 | Share related work with us! This could be a blog post about Cabal 12 | feature or Cabal tool you (or anyone else) wrote. Any Cabal links, 13 | useful resources and hints are appreciated too. 14 | 15 | If you are not sure which section it should belong to, do not hesitate 16 | to open an issue. We are always open to discuss potential enhancements 17 | to the list :heart: 18 | 19 | ### :bug: Report bugs or feature request :bulb: 20 | 21 | If you discovered a bug or have any proposals on how to make this 22 | project better, please feel free to create an issue 23 | [here](https://github.com/kowainik/awesome-cabal/issues/new) in a free 24 | format. 25 | 26 | ### Create a PR 27 | 28 | We love to receive pull requests from everyone! 29 | 30 | To get started with the Pull Request implementation, you can simply 31 | edit `README.md` in the browser. GitHub kindly prompts you to create a 32 | fork and offer to open a PR. 33 | 34 | ---------- 35 | 36 | Thanks for spending your time on reading this contributing guide! :sparkling_heart: 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). 6 | 7 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. 8 | 9 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 10 | 11 | Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: 12 | i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; 13 | 14 | ii. moral rights retained by the original author(s) and/or performer(s); 15 | 16 | iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; 17 | 18 | iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; 19 | 20 | v. rights protecting the extraction, dissemination, use and reuse of data in a Work; 21 | 22 | vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and 23 | 24 | vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 25 | 26 | Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 27 | 28 | Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 29 | 30 | Limitations and Disclaimers. 31 | 32 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. 33 | 34 | b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. 35 | 36 | c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. 37 | 38 | d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. 39 | 40 | For more information, please see http://creativecommons.org/publicdomain/zero/1.0 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Awesome Cabal 2 | 3 | [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) 4 | 5 | ***A curated list of awesome resources for the Haskell Cabal build tool.*** 6 | 7 | Cabal — **C**ommon **A**rchitecture for **B**uilding **A**pplications and 8 | **L**ibraries — is the tool to build and maintain 9 | [Haskell](https://www.haskell.org/) packages. 10 | 11 | ## Table of Contents 12 | 13 | * [Resources](#resources) 14 | * [Installation](#installation) 15 | * [Introduction](#introduction) 16 | * [Scaffolding](#scaffolding) 17 | * [Cabal Configuration Format](#cabal-configuration-format) 18 | * [Components](#components) 19 | * [Backpack](#backpack) 20 | * [PVP](#pvp) 21 | * [Cabal Assistants](#cabal-assistants) 22 | * [CI](#ci) 23 | * [Integration](#integration) 24 | * [Custom Setup](#custom-setup) 25 | * [OS Manifests](#os-manifests) 26 | * [IDE](#ide) 27 | * [Cross Compilation](#cross-compilation) 28 | * [Cabal for Development](#cabal-for-development) 29 | * [Cabal in GSoC](#cabal-in-gsoc) 30 | * [History](#history) 31 | * [Community](#community) 32 | 33 | ## Resources 34 | 35 | * [Official website](https://www.haskell.org/cabal/) 36 | * [Official documentation](https://www.haskell.org/cabal/users-guide/) 37 | * [`haskell/cabal`](https://github.com/haskell/cabal): Official GitHub source 38 | repository. 39 | 40 | ## Installation 41 | 42 | *There are various means of installing `Cabal`. Depending on your operating 43 | system and prefered method, you can choose a suitable way to do that.* 44 | 45 | * [`ghcup`](https://www.haskell.org/ghcup/): 46 | Haskell toolchain installer for **Linux** and **macOS**. 47 | Use `ghcup install-cabal` command to install Cabal. Refer to the 48 | [documentation](https://gitlab.haskell.org/haskell/ghcup-hs) for more details. 49 | * [HVR ppa](https://launchpad.net/~hvr/+archive/ubuntu/ghc): 50 | PPA for **Ubuntu** that includes releases of `Cabal`. 51 | * [Windows setup](https://hub.zhox.com/posts/introducing-haskell-dev/): 52 | The easiest way to setup a Haskell environment on **Windows** using 53 | [Chocolatey](https://chocolatey.org/). 54 | * [Download binary](https://www.haskell.org/cabal/download.html): 55 | Install `Cabal` on **all** operating systems from sources or by downloading 56 | the binary. 57 | * [`CabalChoco`](https://github.com/Mistuke/CabalChoco): 58 | Chocolatey sources for pure Cabal installs on **Windows**. 59 | * [Debian packages](https://downloads.haskell.org/debian/): 60 | Install packages built specifically for **Debian 9 (Stretch)**. 61 | * [macOS setup](https://haskell.futurice.com/): 62 | Python script to install `Cabal` on **macOS**. 63 | * [`ghcups`](https://github.com/kakkun61/ghcups): 64 | `ghcup` for PowerShell on **Windows**. 65 | 66 | #### Blog posts 67 | 68 | * [Managing GHC versions with ghcup](https://qfpl.io/posts/multiple-ghcs-ghcup/): 69 | How to install different GHCs and Cabal. 70 | 71 | ## Introduction 72 | 73 | *Write-ups and examples that could help to get into `Cabal` and start using it.* 74 | 75 | * [Getting started with Haskell and Cabal](https://cabal.readthedocs.io/en/latest/getting-started.html) 76 | * [Intoduction](https://www.haskell.org/cabal/users-guide/intro.html): 77 | Official documentation's introduction. 78 | * [Haskell build tools (by Kowainik)](https://kowainik.github.io/posts/2018-06-21-haskell-build-tools): 79 | Description of the basic workflows with the main Haskell build tools. You can 80 | go straight to the [Cabal section of the post](https://kowainik.github.io/posts/2018-06-21-haskell-build-tools#cabal). 81 | * [Introduction to Cabal (video)](https://haskell-at-work.com/episodes/2018-05-13-introduction-to-cabal.html): 82 | In this video Haskell at Work explores the basics of Cabal including the 83 | family of `new-` commands. 84 | * [Haskell Aliases](https://vrom911.github.io/blog/haskell-aliases): 85 | Shell aliases for Haskell build tools for higher productivity. 86 | * [Organizing Our Package](https://mmhaskell.com/blog/2020/1/6/organizing-our-package): 87 | Walk through the process of creating and managing a new Haskell project. 88 | * [Making the most of Cabal](https://lukelau.me/haskell/posts/making-the-most-of-cabal/): 89 | Showcase of different Cabal features. 90 | 91 | ## Scaffolding 92 | 93 | * [Quick start](https://www.haskell.org/cabal/users-guide/developing-packages.html#quickstart): 94 | Using `cabal init` command to create a project. 95 | * [`summoner`](https://hackage.haskell.org/package/summoner): 96 | CLI tool for scaffolding fully configured batteries-included production-level 97 | Haskell projects. 98 | * [`summoner-tui`](https://hackage.haskell.org/package/summoner-tui): 99 | TUI tool for scaffolding fully configured batteries-included production-level 100 | Haskell projects. 101 | * [`hi`](https://hackage.haskell.org/package/hi): 102 | Generate scaffold for cabal project. 103 | * [`example-cabal-project`](https://github.com/jkachmar/example-cabal-project): 104 | A simple example project using cabal-install, Nix, and direnv. 105 | 106 | ## `Cabal` Configuration Format 107 | 108 | *`.cabal` files use a special format to specify package configurations.* 109 | 110 | * [Docs](https://www.haskell.org/cabal/users-guide/developing-packages.html#pkg-desc): 111 | Official documentation on the package description format. 112 | * [CHANGELOG](https://www.haskell.org/cabal/users-guide/file-format-changelog.html): 113 | Package description format specification history. 114 | * [Minimal cabal files](https://medium.com/@danidiaz/minimal-cabal-files-revisited-a5810215b0d9): 115 | Explanation of the minimal possible cabal configuration. 116 | * [`cabal-fmt`](https://hackage.haskell.org/package/cabal-fmt): 117 | CLI tool to format `.cabal` files. 118 | * ~~[`cabal-info`](https://hackage.haskell.org/package/cabal-info): 119 | Simple command-line interface to read and output information from the 120 | `.cabal` file.~~ (archived, Cabal-1.x only) 121 | 122 | ## Components 123 | 124 | *Useful information on various Cabal components. These could be useful blog 125 | posts on specific features, or description of handy parts of the Cabal 126 | specification.* 127 | 128 | * [Common Stanzas](https://vrom911.github.io/blog/common-stanzas): 129 | Blog post about Cabal's common stanzas feature. 130 | * [Multiple Libraries](https://fgaz.me/posts/2019-11-14-cabal-multiple-libraries/): 131 | Blog post about Cabal's multiple libraries feature. 132 | * [Foreign libraries](https://qnikst.github.io/posts/2018-05-02-cabal-foreign-library.html): 133 | Blog post about Cabal's foreign libraries feature. 134 | * [Foreign libraries example](https://github.com/pdlla/haskell-ffi-cabal-foreign-library-examples): 135 | Example usage of foreign libraries. 136 | * [source-repository-package](https://cabal.readthedocs.io/en/latest/cabal-project.html#specifying-packages-from-remote-version-control-locations): 137 | Specifying packages from remote version control locations (e.g. how to use 138 | GitHub dependencies in the Cabal packages). 139 | * [cabal gen-bounds](https://medium.com/@danidiaz/cabal-gen-bounds-630f6de716d9): 140 | A command to generate lower and upper bounds for dependencies in the `.cabal` 141 | file. 142 | * [`cabal-bounds`](https://hackage.haskell.org/package/cabal-bounds): 143 | A command line program for managing the bounds/versions of the dependencies 144 | in a cabal file. 145 | * [`cabal-cargs`](https://hackage.haskell.org/package/cabal-cargs): 146 | A command line program for extracting compiler arguments from a cabal file. 147 | * [Mix-ins](https://twitter.com/ChShersh/status/1053205244438503429): 148 | Usage of the Cabal's `mixin` feature to replace default `Prelude`. 149 | 150 | ## Backpack 151 | 152 | *__Backpack__ is a feature that allows implementing mix-in libraries in Haskell. 153 | Mix-in libraries can have signatures which permit implementations of values and 154 | types to be deferred, while allowing a library with missing implementations to 155 | still be type-checked.* 156 | 157 | ### Official documentation 158 | 159 | * [Edward Z. Yang thesis](https://github.com/ezyang/thesis) 160 | * [GHC Wiki: Backpack](https://gitlab.haskell.org/ghc/ghc/wikis/backpack) 161 | * [GHC User Guide: Module Signature](https://downloads.haskell.org/ghc/latest/docs/html/users_guide/separate_compilation.html#module-signatures) 162 | * [Cabal user guide: `signatures` field](https://www.haskell.org/cabal/users-guide/developing-packages.html?highlight=backpack#pkg-field-library-signatures) 163 | * [Cabal user guide: `mixins` field](https://www.haskell.org/cabal/users-guide/developing-packages.html?highlight=backpack#pkg-field-mixins) 164 | 165 | ### Tutorials 166 | 167 | * [Edward Z. Yang blog](http://blog.ezyang.com/category/haskell/backpack/): 168 | Blog posts about Backpack implementation and usage from the Backpack author. 169 | * [Picnic: Put containers into backpack (by Kowainik)](https://kowainik.github.io/posts/2018-08-19-picnic-put-containers-into-a-backpack): 170 | This blog post walks the reader through the Backpack implementation of the 171 | uniform interface for containers (`Map`s and `Set`s). 172 | * [Really small Backpack example](https://github.com/danidiaz/really-small-backpack-example): 173 | A small tutorial on the very basics of the Backpack module system. 174 | 175 | ### Libraries 176 | 177 | * [`backpack-str`](https://github.com/haskell-backpack/backpack-str): 178 | Signatures for string types. 179 | * [`reflex-backpack`](https://github.com/ezyang/reflex-backpack): 180 | Backpack implementation of Reflex. 181 | * [`containers-backpack`](https://github.com/kowainik/containers-backpack): 182 | Signatures for various containers (e.g. `Map`, `HashMap`, etc.) 183 | * [`streamy`](https://github.com/danidiaz/streamy): 184 | Signatures for streaming libraries. 185 | * [`unpacked-containers`](https://hackage.haskell.org/package/unpacked-containers): 186 | Unpacked sets and maps exploiting Backpack's ability to unpack through 187 | signatures. 188 | 189 | ### Talks 190 | 191 | * [Backpack to Work (by Edward Z. Yang)](https://www.youtube.com/watch?v=A3ehG4GQpxU) 192 | * [Picnic: put containers into a Backpack (by Dmitrii Kovanikov)](https://www.youtube.com/watch?v=GLtp3Xy7Rps) 193 | 194 | ## PVP 195 | 196 | *It is recommended for Haskell packages to follow PvP — Package versioning 197 | Policy.* 198 | 199 | * [PVP](https://pvp.haskell.org/): 200 | Official Haskell documentation on versioning. 201 | * [`pvp`](https://github.com/haskell/pvp): 202 | The GitHub repository to create issues against. 203 | * [`policeman` (by Kowainik)](https://github.com/kowainik/policeman): 204 | Policeman assists to properly choose the next version number according 205 | to PVP (Packaging Version Policy) for the Haskell packages based on the 206 | semantical changes to the interface. 207 | * [`check-pvp`](https://hackage.haskell.org/package/check-pvp): 208 | Check whether module and package imports conform to the PVP. 209 | 210 | ## Cabal Assistants 211 | 212 | *CLI tools that provide additional interface to `cabal-install`.* 213 | 214 | * [`cabal-install`](https://hackage.haskell.org/package/cabal-install): 215 | The command-line interface for Cabal and Hackage. 216 | * [`vabal`](https://hackage.haskell.org/package/vabal): 217 | The cabal companion that leverages Cabal's capabilities of working with 218 | different GHC versions. 219 | * [`hkgr`](https://hackage.haskell.org/package/hkgr): 220 | Tool to help make new releases of Haskell packages, with commands for git 221 | tagging, pristine sdist, and uploading to Hackage. 222 | * [`releaser`](https://github.com/domenkozar/releaser): 223 | Automation of Haskell package release process. 224 | * [`iridium`](https://hackage.haskell.org/package/iridium): 225 | This tool aims to automate several typical steps when uploading a new package 226 | version to Hackage. 227 | * [Haskell package QA](https://oleg.fi/gists/posts/2018-01-08-haskell-package-qa.html): 228 | New things in Haskell package QA. 229 | * [`cabal-plan`](https://hackage.haskell.org/package/cabal-plan): 230 | Library and utility for processing cabal's `plan.json` file. 231 | * [`cabal-extras`](https://github.com/phadej/cabal-extras): 232 | A tool suite to aid Haskell development using `cabal-install`. 233 | * [`cabal-helper`](https://hackage.haskell.org/package/cabal-helper): 234 | Give Haskell development tools access to the same environment which build 235 | tools such as Cabal normally provide to the compiler. 236 | * [`cabal-sort`](https://hackage.haskell.org/package/cabal-sort): 237 | Given a number of cabal package files, this program reads all those files and 238 | emits them topologically sorted according to their dependencies. 239 | * [`mafia`](https://github.com/haskell-mafia/mafia): 240 | Lightweight but opinionated wrapper around Cabal that makes working on 241 | Haskell projects fun and easy. 242 | * [`cabal-scripts`](https://hackage.haskell.org/package/cabal-scripts): 243 | Collection of Bash Shell scripts for support of Cabal package development. 244 | * [`cabalish`](https://hackage.haskell.org/package/cabalish): 245 | Provides access to the cabal file data for shell scripts. 246 | * [`cab`](https://hackage.haskell.org/package/cab): 247 | A MacPorts-like maintenance command of Haskell Cabal packages. 248 | * [`cabal-edit`](https://github.com/sdiehl/cabal-edit): 249 | A utility for managing Hackage dependencies from the command line. 250 | * [`cabal-clean`](https://github.com/andreasabel/cabal-clean): 251 | Removes compilation artefacts in dist-newstyle/build from older versions of 252 | the package or superseded minor versions of GHC. 253 | 254 | ### Dependencies analysers 255 | 256 | * [`cabalgraph`](https://hackage.haskell.org/package/cabalgraph): 257 | Generate pretty graphs of module trees from `.cabal` files. 258 | * [`cabal-progdeps`](https://hackage.haskell.org/package/cabal-progdeps): 259 | Show dependencies of program being built in current directory. 260 | * [`weeder`](https://github.com/ocharles/weeder): 261 | Tool for detecting redundant Cabal package dependencies that uses `.hie` 262 | files introduced in GHC-8.8. 263 | * [`packdeps`](https://hackage.haskell.org/package/packdeps): 264 | A library and command line tool for checking if the upper bounds in your 265 | Cabal package's dependency list excludes the newest package available. 266 | * [`jailbreak-cabal`](https://hackage.haskell.org/package/jailbreak-cabal): 267 | Strip version restrictions from build dependencies in the `.cabal` files. 268 | 269 | ## CI 270 | 271 | *Information about how to set up Continious Integration on Haskell packages.* 272 | 273 | #### Travis 274 | 275 | * [Dead simple Haskell Travis settings for cabal and stack](https://kodimensional.dev/posts/2019-02-25-haskell-travis): 276 | Blog post about Travis CI settings for Haskell projects with Cabal and Stack. 277 | * [`haskell-ci`](https://hackage.haskell.org/package/haskell-ci): 278 | Cabal package script generator for Travis CI. 279 | * [Testing with Travis](https://qfpl.io/posts/testing-with-travis/): 280 | Blog post about how to quickly and easily set up continuous integration for 281 | your open source Haskell projects hosted on GitHub. 282 | 283 | #### AppVeyor 284 | 285 | * [Haskell & AppVeyor Chocolatey Introduction](https://hub.zhox.com/posts/chocolatey-introduction/): 286 | Stey-by-step description of building Haskel packages with Chocolatey and 287 | Cabal on AppVeyor CI. 288 | * [`appveyor.yml` example](https://github.com/kowainik/tomland/blob/main/appveyor.yml): 289 | Minimal working example of the `appveyor.yml` configuration file. 290 | 291 | #### GitHub Actions 292 | 293 | * [Dead simple cross-platform GitHub Actions for Haskell](https://kodimensional.dev/github-actions): 294 | Blog post about cross-platform GitHub Actions CI settings for 295 | Haskell projects with Cabal and Stack. 296 | * [`haskell-ci`](https://hackage.haskell.org/package/haskell-ci): 297 | Cabal package script generator for GitHub Actions CI. 298 | * [`setup-haskell`](https://github.com/actions/setup-haskell): 299 | Set up your GitHub Actions workflow with a specific version of Haskell (GHC 300 | and Cabal). 301 | * [`actions/cache`](https://github.com/actions/cache/blob/main/examples.md#haskell---cabal): 302 | This action allows caching dependencies and build outputs to improve workflow 303 | execution time. 304 | * [`cabal-plan-bounds`](https://discourse.haskell.org/t/don-t-edit-dependency-bounds-manually-with-this-ci-setup/5539): 305 | Never write bounds manually, instead derive them from what CI is actually testing. 306 | 307 | #### Circle CI 308 | 309 | * [Circle CI orbs](https://circleci.com/orbs/registry/orb/haskell-works/haskell-build-2): 310 | Haskell Orb that Builds a Haskell application using Cabal on Circle CI. 311 | 312 | #### *Generic CI* 313 | 314 | * [`packcheck`](https://github.com/composewell/packcheck): 315 | Universal build and CI testing for Haskell packages. Can produce 316 | configurations for Travis, AppVeyor and Circle CI. 317 | * [`cabal-cache`](https://hackage.haskell.org/package/cabal-cache): 318 | Tool for caching built cabal new-build packages. 319 | * [`hw-ci-assist`](https://hackage.haskell.org/package/hw-ci-assist): 320 | CI Assistant for Haskell projects which implements package caching. 321 | 322 | #### Docker 323 | 324 | * [`docker-ghc`](https://github.com/phadej/docker-ghc): 325 | GHC + Cabal docker image. 326 | * [`ghc-musl`](https://github.com/utdemir/ghc-musl): 327 | Docker image with GHC+musl and Cabal for static executables. 328 | * [Docker Haskell example](https://oleg.fi/gists/posts/2019-07-04-docker-haskell-example.html): 329 | Multi-stage docker build of Haskell webapp. 330 | 331 | #### Deployment 332 | 333 | * [Heroku buildpack GHC](https://github.com/begriffs/heroku-buildpack-ghc): 334 | Buildpack for deploying Haskell apps to Heroku. 335 | * [Haskell on Heroku](http://web.archive.org/web/20150423211821/https://haskellonheroku.com/tutorial/): 336 | This tutorial shows how to develop a simple Haskell web app and deploy it to 337 | Heroku. 338 | 339 | ## Integration 340 | 341 | *Cabal integration with other configuration languages and formats.* 342 | 343 | * [`dhall-to-cabal`](https://hackage.haskell.org/package/dhall-to-cabal): 344 | Compiles Dhall expressions to Cabal files. 345 | * [`cabal-to-dhall`](https://hackage.haskell.org/package/dhall-to-cabal): 346 | The opposite of `dhall-to-cabal`. Compiles Cabal to Dhall expressions. 347 | * [`cabal2nix`](https://hackage.haskell.org/package/cabal2nix): 348 | Convert Cabal files into Nix build instructions. 349 | * [`nix2cabal`](https://github.com/bef0/nix2cabal): 350 | The opposite of `cabal2nix`. It lets you define a Haskell package in Nix and 351 | generate a Cabal file using that definition. 352 | * [`cabal2bazel`](https://github.com/google/cabal2bazel): 353 | A tool to help with fetching Cabal packages from Hackage and importing them 354 | as packages into `cabal2bazel`. 355 | * [`cargo-cabal`](https://github.com/yvan-sraka/cargo-cabal): 356 | A tool that helps you to turn in one command a Rust crate into a Haskell Cabal library. 357 | * [`jenga`](https://hackage.haskell.org/package/jenga): 358 | Generate a `cabal.freeze` file from a `stack.yaml`. 359 | * [`stack2cabal`](https://hackage.haskell.org/package/stack2cabal): 360 | Convert stack projects to `cabal.project` + `cabal.project.freeze`. 361 | * [`shake-cabal`](https://hackage.haskell.org/package/shake-cabal): 362 | A library for using `shake` alongside Cabal. 363 | 364 | ## Custom Setup 365 | 366 | *`Setup.hs` helpers to use in `custom-setup` stanzas with the `Custom` build 367 | type.* 368 | 369 | * [Dependencies for Cabal Setup.hs and other goodies](http://www.well-typed.com/blog/2015/07/cabal-setup-deps/) 370 | * [`autopack`](https://github.com/kowainik/autopack) (by Kowainik): Automatically discovers Haskell modules and populates `exposed-modules`. 371 | * [`proto-lens-setup`](https://hackage.haskell.org/package/proto-lens-setup): 372 | Cabal support for codegen with `proto-lens`. 373 | * [`liquidhaskell-cabal`](https://hackage.haskell.org/package/liquidhaskell-cabal): 374 | Liquid Haskell integration for Cabal and Stack. 375 | * [`liquidhaskell-cabal-demo`](https://hackage.haskell.org/package/liquidhaskell-cabal-demo): 376 | Demo of Liquid Haskell integration for Cabal and Stack. 377 | * [`cabal-build-programs`](https://hackage.haskell.org/package/cabal-build-programs): 378 | Lets you use custom Cabal fields for executable dependencies. 379 | * [`chs-cabal`](https://hackage.haskell.org/package/chs-cabal): 380 | Cabal with c2hs dependencies. 381 | * [`ats-setup`](https://hackage.haskell.org/package/ats-setup): 382 | ATS scripts for Cabal builds. 383 | * [`asset-bundle`](https://hackage.haskell.org/package/asset-bundle): 384 | A build-time Cabal library that bundles executables with assets. 385 | * [`cabal-bundle-clib`](https://hackage.haskell.org/package/cabal-bundle-clib): 386 | Bundling C/C++ projects in Cabal package made easy. 387 | * [`cabal-toolkit`](https://hackage.haskell.org/package/cabal-toolkit): 388 | Helper functions for writing custom `Setup.hs` scripts. 389 | * [`quipper-cabal`](https://hackage.haskell.org/package/quipper-cabal): 390 | Some functions to aid in the creation of Cabal packages for Quipper. 391 | 392 | ## OS Manifests 393 | 394 | *Tools to generate system packages meta information from Haskell packages.* 395 | 396 | * [`cabal-debian`](https://hackage.haskell.org/package/cabal-debian): 397 | Create a Debianization for a Cabal package. 398 | * [`cabal-flatpak`](https://hackage.haskell.org/package/cabal-flatpak): 399 | Generate a FlatPak manifest from a Cabal package description. 400 | * [`cabal-macosx`](https://hackage.haskell.org/package/cabal-macosx): 401 | Cabal support for creating Mac OSX application bundles. 402 | * [`cabal-rpm`](https://hackage.haskell.org/package/cabal-rpm): 403 | RPM packaging tool for Haskell Cabal-based packages. 404 | * [`cabal2spec`](https://hackage.haskell.org/package/cabal2spec): 405 | Convert Cabal files into rpm spec files. 406 | * [`cblrepo`](https://hackage.haskell.org/package/cblrepo): 407 | Tool to simplify managing a consistent set of Haskell packages for 408 | distributions. 409 | * [`exherbo-cabal`](https://hackage.haskell.org/package/exherbo-cabal): 410 | Generates package description from `.cabal` files in format of exheres-0 411 | for Exherbo Linux. 412 | * [`hackport`](https://hackage.haskell.org/package/hackport): 413 | A command line tool to manage an overlay of Gentoo ebuilds that are generated 414 | from a hackage repo of Cabal packages. 415 | 416 | ## IDE 417 | 418 | *Helper tools for Cabal support in various Integrated Development Environments.* 419 | 420 | * [Haskell IDE Setup with cabal and nix](https://github.com/shivamashtikar/haskell-setup): 421 | Haskell setup for vscode with cabal and nix. 422 | * [`codex`](https://hackage.haskell.org/package/codex): 423 | A ctags file generator for Cabal project dependencies. 424 | * [`vim-cabal-indent`](https://github.com/h-youhei/vim-cabal-indent): 425 | `.cabal` files indentation plugin for Vim. 426 | * [`vim-syntax-haskell-cabal`](https://github.com/Twinside/vim-syntax-haskell-cabal): 427 | Cabal syntax highlighting plugin for Vim. 428 | 429 | ## Cross Compilation 430 | 431 | * [The Haskell Cabal and cross compilation](https://medium.com/@zw3rk/the-haskell-cabal-and-cross-compilation-e9885fd5e2f): 432 | Cross compiling packages with Cabal. 433 | 434 | ## Cabal for Development 435 | 436 | *Haskell libraries to parse and work with files in the Cabal format.* 437 | 438 | * [`Cabal`](https://hackage.haskell.org/package/Cabal): 439 | Official library to parse and analyze `.cabal` files. 440 | * [`cabal-lenses`](https://hackage.haskell.org/package/cabal-lenses): 441 | Lenses and traversals for the `Cabal` library. 442 | * [`cabal-install-parsers`](https://hackage.haskell.org/package/cabal-install-parsers): 443 | Parsers for `.cabal`, `cabal.project`, `cabal.config` and `01-index.tar` 444 | files. 445 | * [`cabal-file-th`](https://hackage.haskell.org/package/cabal-file-th): 446 | Template Haskell expressions for reading fields from a project's cabal file. 447 | * [`cabal-test-quickcheck`](https://hackage.haskell.org/package/cabal-test-quickcheck): 448 | QuickCheck for Cabal. 449 | * [`cabal-doctest`](https://hackage.haskell.org/package/cabal-doctest): 450 | A Setup.hs helper for doctests running. 451 | * [`doctest-extract`](https://hackage.haskell.org/package/doctest-extract): 452 | Standalone extraction of doctest code. Optionally emits a list of Test modules for insertion in a Cabal package description. 453 | * [`simple-cabal`](https://hackage.haskell.org/package/simple-cabal): 454 | Find and read `.cabal` files, and a Cabal dependency compatibility layer. 455 | * [`cabal-file`](https://hackage.haskell.org/package/cabal-file): 456 | Cabal file access. 457 | 458 | ## Cabal in GSoC 459 | 460 | *Work on Cabal during Google Summer of Code.* 461 | 462 | * [GSoC 2018: `cabal new-{install,repl,run,clean,sdist}`, Cabal scripts](https://typedr.at/posts/what-i-did-on-my-summer-vacation/): 463 | Description of work to finish bringing Cabal’s Nix-style local builds (the 464 | new- commands, at least for now) up to parity with the old stateful 465 | methodology of using `cabal-install`. 466 | * [GSoC Cabal Nix](https://gitlab.haskell.org/ghc/ghc/wikis/commentary/gsoc-cabal-nix): 467 | How bringing Nix-style package management facilities to cabal can solve 468 | various cabal problems and help in effective mitigation of cabal hell. 469 | 470 | ## History 471 | 472 | * [Old Cabal](https://www.haskell.org/cabal/old.html): 473 | Really old Cabal stuff. 474 | * [Announcing New Cabal](http://blog.ezyang.com/2016/05/announcing-cabal-new-build-nix-style-local-builds/): 475 | `cabal new-build`, also known as “Nix-style local builds”, is a new command 476 | inspired by Nix that comes with `cabal-install 1.24`. 477 | * [Cabal 2.0](http://coldwa.st/e/blog/2017-09-09-Cabal-2-0.html): 478 | What's new in Cabal and `cabal-install` 2.0. 479 | 480 | ## Community 481 | 482 | * [cabal-devel](http://www.haskell.org/mailman/listinfo/cabal-devel): 483 | Development discussion takes place on the cabal-devel mailing list. 484 | * [Libraries mailing list](http://www.haskell.org/mailman/listinfo/libraries): 485 | Questions can be sent to the Haskell libraries mailing list. 486 | * [Issue reporting](https://github.com/haskell/cabal/issues/new): 487 | GitHub issue creation page. 488 | 489 | ## Contribute to this repository 490 | 491 | Improvements to the Awesome Cabal list are more than welcome. Please read the 492 | [contributing guidelines](https://github.com/kowainik/awesome-cabal/blob/main/CONTRIBUTING.md), 493 | go ahead and make the difference! 494 | 495 | ## License 496 | 497 | [![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](https://creativecommons.org/publicdomain/zero/1.0/) 498 | --------------------------------------------------------------------------------