cabal-cargs: A command line program for extracting compiler arguments from a cabal file.

[ bsd3, development, library, program, utils ] [ Propose Tags ]

For further details please consult the README.

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 0.1.1, 0.2, 0.3, 0.3.1, 0.4, 0.5, 0.6, 0.6.1, 0.7, 0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.7.7, 0.7.8, 0.7.9, 0.7.10, 0.7.11, 0.7.12, 0.8.0, 0.8.1, 0.9.0, 0.9.1, 1.0.0, 1.1.0, 1.2.0, 1.3.0, 1.4.0, 1.5.0
Change log CHANGELOG
Dependencies base (>=3 && <5), bytestring (>=0.9 && <0.13), Cabal (>=3.12 && <4.0), cabal-cargs, cabal-lenses (>=0.13.0 && <1.0), cmdargs (>=0.10.5 && <0.11), directory (>=1.0 && <1.4), filepath (>=1.0 && <1.5), lens (>=4.0.1 && <6.0), system-fileio (>=0.3.12 && <0.4), system-filepath (>=0.4.9 && <0.5), text (>= && <2.2), transformers (>= && <0.7), unordered-containers (>= && <0.3) [details]
License BSD-3-Clause
Author Daniel Trstenjak
Category Utils, Development
Source repo head: git clone
Uploaded by DanielTrstenjak at 2024-06-02T13:49:05Z
Reverse Dependencies 1 direct, 0 indirect [details]
Executables cabal-cargs
Downloads 20888 total (90 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
All reported builds failed as of 2024-06-02 [all 1 reports]

Readme for cabal-cargs-1.5.0

[back to package description]


cabal-cargs is a command line program for extracting compiler relevant arguments from a cabal file and print them out formatted so that they're directly usable as arguments for ghc or hdevtools.

The main motivation for writing cabal-cargs was to get a mostly just working default, non modified hdevtools.

Example: Cabal and Sandbox aware Hdevtools

If you want to call hdevtools check for a source file of a cabalized project and would like to consider all compiler relevant arguments in the cabal file - like hs-source-dirs, ghc-options, cpp-options ... - and also the cabal sandbox, then you could just use cabal-cargs the following way:

$> hdevtools check `cabal-cargs --format=hdevtools --sourcefile=Source.hs` Source.hs

This call of cabal-cargs will search for a cabal file starting at the directory of Source.hs upwards the directory tree. The cabal file is then searched for a fitting section for the given source file. A section is considered fitting if the source file is contained in a directory or sub-directory listed in hs-source-dirs.

At the end the fields of the found sections are printed out in the desired format.

Normally you don't want to use cabal-cargs manually, but use it to initialize the options of hdevtools. So in the case of the editor vim and the plugin vim-hdevtools you could use something like:

function! s:CabalCargs(args)
   let l:output = system('cabal-cargs ' . a:args)
   if v:shell_error != 0
      let l:lines = split(l:output, '\n')
      echohl ErrorMsg
      echomsg 'args: ' . a:args
      for l:line in l:lines
         echomsg l:line
      echohl None
      return ''
   return l:output

function! s:HdevtoolsOptions()
    return s:CabalCargs('--format=hdevtools --sourcefile=' . shellescape(expand('%')))

autocmd Bufenter *.hs :call s:InitHaskellVars()

function! s:InitHaskellVars()
   if filereadable(expand('%'))
      let g:hdevtools_options = s:HdevtoolsOptions()

To see if cabal-cargs did the right thing you can verify the hdevtools options by calling in the vim command line:

:let g:hdevtools_options

Example: Compiler Arguments from Cabal File

Instead of searching for the cabal file by a source file the cabal file can be given explicitly:

$> cabal-cargs --cabalfile=Some.cabal

If an additional source file is given, then the cabal file is searched for a fitting section.

If no cabal file nor a source file is given, then starting at the current directory a cabal file is searched upwards the directory tree.


If you don't want any automatic finding of sections or only want to consider a certain section, then you could do this by using the options:

  • --library
  • --executable=name
  • --testsuite=name
  • --benchmark=name
  • --allsections

You can use multiple of these options at once and even specify multiple e.g. executables at once: --executable=exe1 --executable=exe2 ....


By default all fields of a section are printed out. You can constrain the output by the options: --only=name or --ignore=name. These options can be specified multiple times.

The allowed names are the field names from the cabal file, just the hyphen replaced by an underscore e.g.: hs-source-dirs -> hs_source_dirs.

Currently supported cabal fields are:

  • hs_source_dirs
  • ghc_options
  • default_extensions
  • default_language
  • cpp_options
  • c_sources
  • cc_options
  • extra_lib_dirs
  • extra_libraries
  • ld_options
  • include_dirs
  • includes
  • build_depends

There are further some special fields:

  • package_db
  • root_dir
  • autogen_hs_source_dirs
  • autogen_include_dirs
  • autogen_includes
  • hdevtools_socket

It's not quite true, that all fields are printed out if not constrained, that's only the case for the pure formatting option. For the other formatting options currently the fields c_sources and ld_options are ignored and additionally the ghc formatting option ignores the hdevtools_socket field.


The conditional parts of the cabal file are respected by cabal-cargs by taking the default values of the flags defined in the cabal file into account.

You can overwrite the default values of the flags with the options:

  • --enable=FLAGNAME
  • --disable=FLAGNAME

It's also possible to overwrite the OS and Arch values - which by default are the ones the cabal library was build on - with the options:

  • --os=OSNAME
  • --arch=ARCHNAME


By default the fields are formatted for the ghc compiler. The available options for --format are:

  • ghc
  • hdevtools
  • pure

pure prints the values like they are present in the cabal file and is mostly only useful in conjunction with --only to get the value of one cabal field.


It's recommended to build cabal-cargs in a cabal sandbox with: cabal install cabal-cargs.