Files
Dark Steveneq 646b892680
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
push sheeet
2025-10-09 14:15:47 +02:00

85 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 ? "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 != ""))
(lib.concatLines)
];
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"'';
}