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