Something went wrong. Try again.
What happens if I push all of nixpkgs
Something went wrong. Try again.
2.4 kB · 84 lines
Nix
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485{ 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 ];inwriteTextFile { 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"'';}