makePkgconfigItem: init new function to generate pc files
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`.
This commit is contained in:
parent
96728ff138
commit
7249b8a2f3
69
pkgs/build-support/make-pkgconfigitem/default.nix
Normal file
69
pkgs/build-support/make-pkgconfigitem/default.nix
Normal file
@ -0,0 +1,69 @@
|
||||
{ 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"'';
|
||||
}
|
46
pkgs/build-support/setup-hooks/copy-pkgconfig-items.sh
Normal file
46
pkgs/build-support/setup-hooks/copy-pkgconfig-items.sh
Normal file
@ -0,0 +1,46 @@
|
||||
# shellcheck shell=bash
|
||||
|
||||
# Setup hook that installs specified pkgconfig items.
|
||||
#
|
||||
# Example usage in a derivation:
|
||||
#
|
||||
# { …, makePkgconfigItem, copyPkgconfigItems, … }:
|
||||
#
|
||||
# let pkgconfigItem = makePkgconfigItem { … }; in
|
||||
# stdenv.mkDerivation {
|
||||
# …
|
||||
# nativeBuildInputs = [ copyPkgconfigItems ];
|
||||
#
|
||||
# pkgconfigItems = [ pkgconfigItem ];
|
||||
# …
|
||||
# }
|
||||
#
|
||||
# This hook will copy files which are either given by full path
|
||||
# or all '*.pc' files placed inside the 'lib/pkgconfig'
|
||||
# folder of each `pkgconfigItems` argument.
|
||||
|
||||
postInstallHooks+=(copyPkgconfigItems)
|
||||
|
||||
copyPkgconfigItems() {
|
||||
if [ "${dontCopyPkgconfigItems-}" = 1 ]; then return; fi
|
||||
|
||||
if [ -z "$pkgconfigItems" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
pkgconfigdir="${!outputDev}/lib/pkgconfig"
|
||||
for pkgconfigItem in $pkgconfigItems; do
|
||||
if [[ -f "$pkgconfigItem" ]]; then
|
||||
substituteAllInPlace "$pkgconfigItem"
|
||||
echo "Copying '$pkgconfigItem' into '${pkgconfigdir}'"
|
||||
install -D -m 444 -t "${pkgconfigdir}" "$pkgconfigItem"
|
||||
substituteAllInPlace "${pkgconfigdir}"/*
|
||||
else
|
||||
for f in "$pkgconfigItem"/lib/pkgconfig/*.pc; do
|
||||
echo "Copying '$f' into '${pkgconfigdir}'"
|
||||
install -D -m 444 -t "${pkgconfigdir}" "$f"
|
||||
substituteAllInPlace "${pkgconfigdir}"/*
|
||||
done
|
||||
fi
|
||||
done
|
||||
}
|
@ -826,6 +826,10 @@ with pkgs;
|
||||
|
||||
makeDesktopItem = callPackage ../build-support/make-desktopitem { };
|
||||
|
||||
copyPkgconfigItems = makeSetupHook { } ../build-support/setup-hooks/copy-pkgconfig-items.sh;
|
||||
|
||||
makePkgconfigItem = callPackage ../build-support/make-pkgconfigitem { };
|
||||
|
||||
makeDarwinBundle = callPackage ../build-support/make-darwin-bundle { };
|
||||
|
||||
makeAutostartItem = callPackage ../build-support/make-startupitem { };
|
||||
|
Loading…
Reference in New Issue
Block a user