Create pkg-config configuration files https://github.com/trskop/hs-pkg-config

Latest on Hackage:

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD3 licensed by Peter Trško
Maintained by peter.trsko@gmail.com


Hackage [BSD3 License][tl;dr Legal: BSD3]


Library for creating [pkg-config][Pkg-config Homepage] configuration files from Haskell.

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


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

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

import Data.String (IsString)

import Data.Default.Class (Default(def))
   -- From data-default-class library:
   -- http://hackage.haskell.org/package/data-default-class

import Control.Lens
   -- From lens library:
   -- http://hackage.haskell.org/package/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 delete lines that define Requires: field, then pkg-config would be able to give us --cflags, --libs, etc. You can try it.

Building options

  • -fpedantic (disabled by default)

    Pass additional warning flags including -Werror to GHC during compilation.

https://hackage.haskell.org/package/hs-pkg-config "Hackage: hs-pkg-config" [Pkg-config Homepage]: http://www.freedesktop.org/wiki/Software/pkg-config/ "Pkg-config Homepage" [Shake Homepage]: http://shakebuild.com "Shake Homepage" [tl;dr Legal: BSD3]: https://tldrlegal.com/license/bsd-3-clause-license-%28revised%29 "BSD 3-Clause License (Revised)"


ChangeLog / ReleaseNotes



  • New functions in Data.PkgCofig module: quote :: PkgTemplate -> PkgTemplate option :: Strict.Text -> PkgTemplate -> PkgTemplate * strOption :: String -> PkgTemplate -> PkgTemplate

  • Quoting option arguments by default. This affects following functions from Data.PkgCofig module: includes :: [PkgTemplate] -> PkgTemplate libraryPath :: [PkgTemplate] -> PkgTemplate

  • Lot of documentation updates.

  • Uploaded to Hackage: http://hackage.haskell.org/package/hs-pkg-config-


http://hackage.haskell.org/ "HackageDB (or just Hackage) is a collection of releases of Haskell packages."

Depends on 3 packages:
Used by 1 package:
comments powered byDisqus