7249b8a2f3
A function to generate pkg-config files for Nix packages that need to create them ad hoc, like blas and lapack. Inspiration taken from `makeDesktopItem`.
70 lines
2.3 KiB
Nix
70 lines
2.3 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/pkg-config --validate "$target"'';
|
|
}
|