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

[ bsd3, data, development, library ] [ Propose Tags ]

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]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.2.0.0, 0.2.1.0
Change log ChangeLog.md
Dependencies base (>=4.6 && <4.8), data-default-class (<1), text (>=0.11 && <1.3) [details]
License BSD-3-Clause
Copyright Copyright (c) 2014 Peter Trško
Author Peter Trško
Maintainer peter.trsko@gmail.com
Category Data, Development
Home page https://github.com/trskop/hs-pkg-config
Source repo head: git clone git://github.com/trskop/between.git
this: git clone git://github.com/trskop/between.git(tag 0.1.0.0)
Uploaded by PeterTrsko at 2014-12-14T17:44:42Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 2988 total (9 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user [build log]
All reported builds failed as of 2014-12-14 [all 1 reports]

Readme for hs-pkg-config-0.1.0.0

[back to package description]

Introduction

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.

Example

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

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

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
  where
    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:

prefix=/usr/local
includedir=${prefix}/include
libdir=${prefix}/lib
arch=i386

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
1.2.3

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.