The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

PkgConfig - Pure-Perl Core-Only replacement for pkg-config

SYNOPSIS

As a replacement for pkg-config

    $ ppkg-config --libs --cflags --static gio-2.0

    #outputs (lines artifically broken up for readability):
    # -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
    # -pthread -lgio-2.0 -lz -lresolv -lgobject-2.0
    # -lgmodule-2.0 -ldl -lgthread-2.0 -pthread -lrt -lglib-2.0

pkg-config.pl can be used as an alias for ppkg-config on platforms that support it. It can also be installed as pkg-config though this is not recomended if your system has a nativ pkg-config.

Compare to: $ pkg-config --libs --cflags --static gio-2.0

    #outputs ( "" ):
    # -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
    # -pthread -lgio-2.0 -lz -lresolv -lgobject-2.0 -lgmodule-2.0
    # -ldl -lgthread-2.0 -lrt -lglib-2.0

From another Perl module

    use PkgConfig;

    my $o = PkgConfig->find('gio');
    if($o->errmsg) {
        #handle error
    } else {
        my @cflags = $o->get_cflags;
        my @ldflags = $o->get_ldflags;
    }

DESCRIPTION

PkgConfig provides a pure-perl, core-only replacement for the pkg-config utility.

This is not a description of the uses of pkg-config but rather a description of the differences between the C version and the Perl one.

While pkg-config is a compiled binary linked with glib, the pure-perl version has no such requirement, and will run wherever Perl ( >= 5.04 ) does.

The main supported options are the common --libs, --cflags, --static, --exists and --modversion.

SCRIPT OPTIONS

USAGE

    <packagename1 pkgname2..> [ --options ]

ARGUMENTS

By default, a library name must be supplied unless one of --version, or --real-version is specified.

The output should normally be suitable for passing to your favorite compiler.

--libs

(Also) print linker flags. Dependencies are traverse in order. Top-level dependencies will appear earlier in the command line than bottom-level dependencies.

--libs-only-L

Prints -L/-R part of "--libs". It defines library search path but without libraries to link with.

--libs-only-l

Prints the -l part of "--libs".

--list-all

List all know packages.

--cflags

(Also) print compiler and C preprocessor flags.

--modversion

Print the version of a given package.

--static

Use extra dependencies and libraries if linking against a static version of the requested library

--exists

Return success (0) if the package exists in the search path.

--with-path=PATH

Prepend PATH to the list of search paths containing .pc files.

This option can be specified multiple times with different paths, and they will all be added.

--env-only

Using this option, only paths specified in PKG_CONFIG_PATH are recognized and any hard-coded defaults are ignored.

--guess-paths

Invoke gcc and ld to determine default linker and include paths. Default paths will be excluded from explicit -L and -I flags.

--define-variable=VARIABLE=VALUE

Define a variable, overriding any such variable definition in the .pc file, and allowing your value to interpolate with subsequent uses.

--variable=VARIABLE

This returns the value of a variable defined in a package's .pc file.

--print-variables

Print all defined variables found in the .pc files.

--version

The target version of pkg-config emulated by this script

--real-version

The actual version of this script

--debug

Print debugging information

--silence-errors

Turn off errors. This is the default for non-libs/cflag/modversion arguments

--print-errors

This makes all errors noisy and takes precedence over --silence-errors

ENVIRONMENT

the PKG_CONFIG_PATH variable is honored and used as a colon-delimited list of directories with contain .pc files.

MODULE OPTIONS

PkgConfig->find

    my $result = PkgConfig->find($libary, %options);

Find a library and return a result object. $library can be either a single name of a library, or a reference to an array of library names

The options are in the form of hash keys and values, and the following are recognized:

search_path
search_path_override

Prepend search paths in addition to the paths specified in $ENV{PKG_CONFIG_PATH} The value is an array reference.

the _override variant ignores defaults (like PKG_CONFIG_PATH).

file_path

Specifies the full path of the of the .pc file that you wish to load. It does not need to be in the search path (although any dependencies will need to be). Useful if you know the full path of the exact .pc file that you want.

exclude_cflags
exclude_ldflags
exclude_cflags_override
exclude_ldflags_override

Some .pc files specify default compiler and linker search paths, e.g. -I/usr/include -L/usr/lib. Specifying them on the command line can be problematic as it drastically changes the search order.

The above options will either append or replace the options which are excluded and filtered.

The default excluded linker and compiler options can be obtained via @PkgConfig::DEFAULT_EXCLUDE_LFLAGS and @PkgConfig::DEFAULT_EXCLUDE_CFLAGS, respectively.

static

Also specify static libraries.

no_recurse

Do not recurse dependencies. This is useful for just doing version checks.

VARS

Define a hashref of variables to override any variable definitions within the .pc files. This is equivalent to the --define-variable command-line option.

A PkgConfig object is returned and may be queried about the results:

$o->errmsg

An error message, if any. This is a string and indicates an error.

$o->pkg_exists

Boolean value, true if the package exists.

$o->pkg_version

The version of the package

$o->get_cflags

$o->get_ldflags

Returns a list of compiler and linker flags, respectively.

PkgConfig->Guess

This is a class method, and will replace the hard-coded default linker and include paths with those discovered by invoking ld(1) and cpp(1).

Currently this only works with GCC-supplied ld and GNU ld.

INSTALL

The Makefile.PL that comes with PkgConfig can take one or more --script options to change of the name of the script or scripts that are installed.

--script ppkg-config

This is the default and works on all platforms

--script pkg-config.pl

This is installed by default on all platforms except for Windows, where the .pl may confuse the shell and cause the script to be opened in a text editor.

--script pkg-config

This is the default name of the real pkg-config and so you have to specifically enable it if you want it.

--script none

Don't install any scripts.

Example, install all script names:

 % perl Makefile.PL --script ppkg-config --script pkg-config.pl --script pkg-config

Example, don't install any scripts:

 % perl Makefile.PL --script none

BUGS

The order of the flags is not exactly matching to that of pkg-config. From my own observation, it seems this module does a better job, but I might be wrong.

Unlike pkg-config, the scripts --exists function will return nonzero if a package or any of its dependencies are missing. This differs from the behavior of pkg-config which will just check for the definition of the package itself (without dependencies).

SEE ALSO

ExtUtils::PkgConfig, a wrapper around the pkg-config binary

pkg-config

http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/pkg-config/ another perl implementation of pkg-config

AUTHOR

Original Author: M. Nunberg
Current maintainer: Graham Ollis <plicease@cpan.org>

Other contributors include:

kmx
Sanel Zukan

COPYRIGHT AND LICENSE

Copyright (C) 2012 M. Nunberg

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.