hs-pkg-config

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

Latest on Hackage:0.2.1.0

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

Hs-pkg-config

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

Description

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

Example

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

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

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
  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 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)"

Changes

ChangeLog / ReleaseNotes

Version 0.2.1.0

Version 0.2.0.0

  • 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-0.2.0.0

Version 0.1.0.0

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

Used by 1 package:
comments powered byDisqus