@hackage cabal-cargs0.7.11

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

cabal-cargs

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
      endfor
      echohl None
      return ''
   endif
   return l:output
endfunction

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

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

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

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.

Sections

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 ....

Fields

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
  • 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.

Flags

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

Formatting

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.

Installation

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