88 lines
2.4 KiB
Nix
88 lines
2.4 KiB
Nix
|
{
|
||
|
lib,
|
||
|
writeTextFile,
|
||
|
buildPackages,
|
||
|
}:
|
||
|
|
||
|
# See https://people.freedesktop.org/~dbn/pkg-config-guide.html#concepts
|
||
|
{
|
||
|
name, # The name of the pc file
|
||
|
# keywords
|
||
|
# provide a default description for convenience. it's not important but still required by pkg-config.
|
||
|
description ? "A pkg-config file for ${name}",
|
||
|
url ? "",
|
||
|
version ? "",
|
||
|
requires ? [ ],
|
||
|
requiresPrivate ? [ ],
|
||
|
conflicts ? [ ],
|
||
|
cflags ? [ ],
|
||
|
libs ? [ ],
|
||
|
libsPrivate ? [ ],
|
||
|
variables ? { },
|
||
|
}:
|
||
|
|
||
|
let
|
||
|
# only 'out' has to be changed, otherwise it would be replaced by the out of the writeTextFile
|
||
|
placeholderToSubstVar = builtins.replaceStrings [ "${placeholder "out"}" ] [ "@out@" ];
|
||
|
|
||
|
replacePlaceholderAndListToString =
|
||
|
x:
|
||
|
if builtins.isList x then
|
||
|
placeholderToSubstVar (builtins.concatStringsSep " " x)
|
||
|
else
|
||
|
placeholderToSubstVar x;
|
||
|
|
||
|
keywordsSection =
|
||
|
let
|
||
|
mustBeAList = attr: attrName: lib.throwIfNot (lib.isList attr) "'${attrName}' must be a list" attr;
|
||
|
in
|
||
|
{
|
||
|
"Name" = name;
|
||
|
"Description" = description;
|
||
|
"URL" = url;
|
||
|
"Version" = version;
|
||
|
"Requires" = mustBeAList requires "requires";
|
||
|
"Requires.private" = mustBeAList requiresPrivate "requiresPrivate";
|
||
|
"Conflicts" = mustBeAList conflicts "conflicts";
|
||
|
"Cflags" = mustBeAList cflags "cflags";
|
||
|
"Libs" = mustBeAList libs "libs";
|
||
|
"Libs.private" = mustBeAList libsPrivate "libsPrivate";
|
||
|
};
|
||
|
|
||
|
renderVariable =
|
||
|
name: value:
|
||
|
lib.optionalString (
|
||
|
value != "" && value != [ ]
|
||
|
) "${name}=${replacePlaceholderAndListToString value}";
|
||
|
renderKeyword =
|
||
|
name: value:
|
||
|
lib.optionalString (
|
||
|
value != "" && value != [ ]
|
||
|
) "${name}: ${replacePlaceholderAndListToString value}";
|
||
|
|
||
|
renderSomething =
|
||
|
renderFunc: attrs:
|
||
|
lib.pipe attrs [
|
||
|
(lib.mapAttrsToList renderFunc)
|
||
|
(builtins.filter (v: v != ""))
|
||
|
(builtins.concatStringsSep "\n")
|
||
|
(section: ''
|
||
|
${section}
|
||
|
'')
|
||
|
];
|
||
|
|
||
|
variablesSectionRendered = renderSomething renderVariable variables;
|
||
|
keywordsSectionRendered = renderSomething renderKeyword keywordsSection;
|
||
|
|
||
|
content = [
|
||
|
variablesSectionRendered
|
||
|
keywordsSectionRendered
|
||
|
];
|
||
|
in
|
||
|
writeTextFile {
|
||
|
name = "${name}.pc";
|
||
|
destination = "/lib/pkgconfig/${name}.pc";
|
||
|
text = builtins.concatStringsSep "\n" content;
|
||
|
checkPhase = ''${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config --validate "$target"'';
|
||
|
}
|