Library for creating pkg-config configuration files from Haskell. Pkg-config is a tool for inserting correct compiler options when compiling libraries or applications. It is language-agnostic, but mainly used for building various C or C++ libraries and applications.
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 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.
-
-fpedantic
(disabled by default)Pass additional warning flags including
-Werror
to GHC during compilation.