MyNixOS website logo
Description

Access the functions from the Cabal library without depending on it.

This library allows you to extract information from cabal files without depending on the Cabal library. Since GHC currently depends on Cabal, it's difficult to directly use Cabal if you also like to use the GHC API. This package solves that problem by using the GHC API itself to interface with Cabal, which means that it can use whatever Cabal version the user has installed, at run time (the version is not fixed at compile time). For a short tutorial, see https://github.com/bennofs/dynamic-cabal. Note: As of GHC 7.10, the ghc library no longer depends on Cabal. So you only need this package if you want to support older GHC versions.

dynamic-cabal

Build Status

Note: The problem this library solves no longer exists starting with GHC 7.10, since versions later than that do not depend on the Cabal library. You only need this library if you like to support older GHC versions.

If you've ever used Cabal together with the GHC-API, you know the problem. Because GHC depends on a version of Cabal, which is often outdated, there is no way to parse the setup-config file generated by newer cabal versions. This library attemps to solve the problem by dynamically generating code that performs the action you want, and then compiling and loading that with GHC. With this method, you don't need to depend on Cabal at compile time and so you can use any version of Cabal.

Usage

Currently, the library only allows two queries: Getting the targets (along with their dependencies, ghc options, etc) and the package databases. The first is easily achieved using the targets query provided by the library. To run the query, you can use the runQuery function, which takes the path to the setup-config file as an argument. For example, the following little program prints out the names of all test suites, when run in a configured cabal project root directory:

import Distribution.Client.Dynamic

main :: IO ()
main = do
  tgs <- runQuery (on localPkgDesc targets) "dist/setup-config"
  mapM_ putStrLn [ n | TestSuite n <- map name tgs ]

Because targets works on a PackageDescription, on localPkgDesc is used to get the current PackageDescription.

Contributing

At the moment, I only implemented the functions I need myself. If you have more functions you want to implement, just send a pull request or open an issue.

Metadata

Version

0.3.5

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows