hs-pkg-config: Create pkg-config configuration files

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.


Create pkg-config configuration file from Haskell code using combinators specialized for this purpose.

One of the possible usage examples of this library is generating .pc files from Shake build system.

For usage example see Data.PkgConfig module.

[Skip to ReadMe]


Change logChangeLog.md
Dependenciesbase (>=4.6 && <4.8), data-default-class (==0.*), text (>=0.11 && <1.3) [details]
CopyrightCopyright (c) 2014 Peter Trško
AuthorPeter Trško
CategoryData, Development
Home pagehttps://github.com/trskop/hs-pkg-config
Source repositoryhead: git clone git://github.com/trskop/between.git
this: git clone git://github.com/trskop/between.git(tag
UploadedSun Dec 14 17:38:08 UTC 2014 by PeterTrsko




Maintainers' corner

For package maintainers and hackage trustees

Readme for hs-pkg-config-

[back to package description]


Library for creating pkg-config configuration files from Haskell.

One of the possible usage examples of this library is generating .pc files from Shake build system.


Following Haskell code is able to generate package config named foo.pc for library foo:

{-# LANGUAGE OverloadedStrings #-}
module Main (main)

import Data.Default.Class (Default(def))
import Data.String (IsString)
import Control.Lens

import Data.PkgConfig

libraryBaseName :: IsString a => a
libraryBaseName = "foo"

main :: IO ()
main = writePkgConfig (libraryBaseName ++ ".pc") libPkgConfig
    libPkgConfig = def
        & pkgVariables   .~
            [ ("prefix",     "/usr/local"              )
            , ("includedir", var "prefix" </> "include")
            , ("libdir",     var "prefix" </> "lib"    )
            , ("arch",       "i386"                    )
        & pkgName        .~ libraryBaseName
        & pkgDescription .~ "Example pkg-config."
        & pkgVersion     .~ version [1, 2, 3]
        & pkgCflags      .~ includes [var "includedir"]
        & pkgRequires    .~ list
            [ "bar" ~> [0], "bar" ~<= [3, 1]
            , "baz" ~= [1, 2, 3]
        & pkgLibs        .~ options
            [ libraryPath [var "libdir", var "libdir" </> var "arch"]
            , libraries [libraryBaseName]

Content of foo.pc:


Name: foo
Description: Example pkg-config.
Version: 1.2.3
Requires: bar > 0, bar <= 3.1, baz = 1.2.3
Cflags: -I${includedir}
Libs: -L${libdir} -L${libdir}/${arch} -lfoo

Now lets see if pkg-config would be able to tell us something about this library:

$ PKG_CONFIG_PATH=`pwd` pkg-config --modversion foo

Note that asking for --cflags or other options would result in error saying that it is unable to find bar and baz libraries. That is OK, it means that it is able to parse file correctly, we just hadn't provided bar.pc and baz.pc. If we would delete lines that define Requires: field, then pkg-config would be able to give us --cflags, --libs, etc. You can try it.