PKG-CONFIG(1)

πŸ“¦
version 0.25026 Β· 2 versions
, in opensuse-leap 16.0

πŸ¦‹ PKG-CONFIG(1) πŸ¦‹

okay so this is the PKG-CONFIG(1) page from the User Contributed Perl Documentation, and it's all about PkgConfig β€” a pure-Perl, core-only replacement for pkg-config. bestie, get comfy, there's a lot here and it's honestly kind of iconic. πŸŽ€

✨ NAME ✨

PkgConfig β€” Pure-Perl Core-Only replacement for pkg-config. no glib, no compiled binary, just vibes and Perl. πŸ’…

🌸 SYNOPSIS 🌸

πŸ’– As a replacement for pkg-config

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

#outputs (lines artificially 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 recommended if your system has a native pkg-config. lowkey don't do that. πŸ™ˆ

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 $prefix = $o->get_var('prefix');
    my @cflags = $o->get_cflags;
    my @ldflags = $o->get_ldflags;
}

πŸ‘‘ DESCRIPTION πŸ‘‘

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

fr fr though: this is not a description of what pkg-config is used for. it's a description of the differences between the C version and the Perl one. that's the whole assignment. 🫢

while pkg-config is a compiled binary linked with glib, the pure-perl version has no such requirement, and will run wherever Perl ( >= 5.6 ) does. literally anywhere. it's giving portability queen. πŸ’œ

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 traversed in order. Top-level dependencies will appear earlier in the command line than bottom-level dependencies. order matters, bestie, don't come for me. πŸ”₯
  • --libs-only-L β€” Prints the -L/-R part of --libs. It defines the library search path but without the libraries to link with.
  • --libs-only-l β€” Prints the -l part of --libs.
  • --libs-only-other β€” Prints the part of --libs not covered by --libs-only-L and --libs-only-l, such as --pthread.
  • --list-all β€” List all known packages.
  • --cflags β€” (Also) print compiler and C preprocessor flags.
  • --cflags-only-I β€” Prints the -I part of --cflags.
  • --cflags-only-other β€” Prints the parts of --cflags not covered by --cflags-only-I.
  • --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. stacking, we love to see it. 🫢
  • --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. (yes, she has range. πŸ’…)
  • --debug β€” Print debugging information.
  • --silence-errors β€” Turn off errors. This is the default for non-libs/cflag/modversion arguments.
  • --print-errors β€” Print errors to STDERR and takes precedence over --silence-errors.
  • --short-errors β€” Ignored, but recognized for compatibility. it's just there to be there, honestly. πŸ’€
  • --errors-to-stdout β€” Print errors to STDOUT and takes precedence over --print-errors.

πŸ¦‹ ENVIRONMENT πŸ¦‹

the PKG_CONFIG_PATH and PKG_CONFIG_LIBDIR variables are honored and used as a colon-delimited (semicolon-delimited on Windows) list of directories which contain .pc files.

Other environment variables recognized by both pkg-config and PkgConfig include:

  • PKG_CONFIG_ALLOW_SYSTEM_CFLAGS
  • PKG_CONFIG_ALLOW_SYSTEM_LIBS

If Win32API::Registry is installed, on Windows (but not Cygwin) PkgConfig will also consult these registry keys. The names are ignored, but the values are paths containing .pc files.

  • HKEY_CURRENT_USER\Software\pkgconfig\PKG_CONFIG_PATH
  • HKEY_LOCAL_MACHINE\Software\pkgconfig\PKG_CONFIG_PATH
Registry support should be considered somewhat experimental, subject to change in the future, though not without good reason. The rationale for this caveat is that this feature is documented in several places, but I have yet to find a working version that implements this feature. 😭 so like... it's documented, but nobody's actually seen it work. consider yourself warned.

πŸ’œ MODULE OPTIONS πŸ’œ

🌟 PkgConfig->find

my $result = PkgConfig->find($library, %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. either way, she'll handle it. ✨

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 .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. iykyk. 🎯
  • 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. minimal effort, maximum result. πŸ’…
  • 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 compiler and linker flags, respectively. In list context, these methods return a list with each argument split on unescaped spaces. In list context returns a list of compiler and linker flags, respectively. In scalar context returns a string of compiler and linker flags with spaces and quotes escaped correctly.
  • $o->get_var($name) β€” Get the variable with the given name.

🌸 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 the name of the script or scripts that are installed. name your baby whatever you want, honestly. πŸ‘‘

  • --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. 😭 (not the text editor jumpscare)
  • --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. the void. πŸ’€

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

You can also set the environment variable PERL_PKG_CONFIG_SCRIPTS to the desired --script value (separating each script name with a comma ,) to ensure that upgrades of PkgConfig do the same. set it and forget it, bestie. 🫢

⭐ CAVEATS ⭐

On Strawberry Perl ppkg-config acts like Strawberry is the system. This means that:

  • The .pc files that are bundled with Strawberry are searched by default.
  • The Strawberry include and lib directories are used to compute the exclusion lists.

As of Strawberry 5.20.0.1 PkgConfig is bundled with Strawberry and pkg-config is installed by default (in addition to ppkg-config, though the ppkg-config alias is NOT bundled with Strawberry itself).

For details on how to patch the .pc files bundled with older Strawberries, see the README.win32 that comes with this Distribution.

🧚 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. 😌 (humble queen behavior, honestly)

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). ⚠️ different behavior, so don't get caught out.

🌈 SEE ALSO 🌈

ok so if you wanna go deeper (and honestly, why wouldn't you, you're doing amazing sweetie πŸ’–), here's the whole extended universe of pkg-config implementations and friends:


πŸ‘‘ AUTHOR πŸ‘‘

ok the lore drop, gather round:

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

and the other contributors include (a whole ensemble cast, main character energy all around πŸ’œ):

  • Vladimir Timofeev (vovkasm)
  • kmx
  • Sanel Zukan
  • Breno G. de Oliveira (garu)
  • Gregor Herrmann
  • Ilya Pavlov (ILUX, Ilya33)
  • Shawn Laffan (SLAFFAN, shawnlaffan)
  • Ari Jolma (AJOLMA)

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. so yes, free as in go off, do your thing, just keep the terms, bestie πŸ¦‹


πŸ’€ one gentle reminder: that license line is a real legal thing, not a vibe β€” if you're redistributing, keep it exactly as the Perl 5 terms say. The fairy emoji will not protect you in court 🧚

and that's a wrap on the whole page, bestie!! go configure some packages, you absolute legend πŸ”₯

⭐ signed off from perl v5.42.0, dated 2020-11-12, under the title PKG-CONFIG(1) ⭐ β€” mwah, love u, bye πŸ’‹

πŸ“¦ where this page comes from