Merge pull request #178567 from Artturin/pkgconfignew

makePkgconfigItem: init new function to generate pc files
This commit is contained in:
Anderson Torres 2022-07-20 23:31:58 -03:00 committed by GitHub
commit b73f704a2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 161 additions and 13 deletions

View 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"'';
}

View 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
}

View file

@ -1,6 +1,8 @@
{ lib
, stdenv
, fetchFromRepoOrCz
, copyPkgconfigItems
, makePkgconfigItem
, perl
, texinfo
, which
@ -17,11 +19,32 @@ stdenv.mkDerivation rec {
};
nativeBuildInputs = [
copyPkgconfigItems
perl
texinfo
which
];
pkgconfigItems = [
(makePkgconfigItem rec {
name = "libtcc";
inherit version;
cflags = [ "-I${variables.includedir}" ];
libs = [
"-L${variables.libdir}"
"-Wl,--rpath ${variables.libdir}"
"-ltcc"
"-ldl"
];
variables = rec {
prefix = "${placeholder "out"}";
includedir = "${prefix}/include";
libdir = "${prefix}/lib";
};
description = "Tiny C compiler backend";
})
];
postPatch = ''
patchShebangs texi2pod.pl
'';
@ -43,17 +66,6 @@ stdenv.mkDerivation rec {
configureFlagsArray+=("--elfinterp=$(< $NIX_CC/nix-support/dynamic-linker)")
'';
postFixup = ''
cat >libtcc.pc <<EOF
Name: libtcc
Description: Tiny C compiler backend
Version: ${version}
Libs: -L$out/lib -Wl,--rpath $out/lib -ltcc -ldl
Cflags: -I$out/include
EOF
install -Dt $out/lib/pkgconfig libtcc.pc -m 444
'';
outputs = [ "out" "info" "man" ];
doCheck = true;

View file

@ -1,6 +1,6 @@
{ lib, stdenv, fetchFromGitHub }:
{ lib, stdenv, fetchFromGitHub, copyPkgconfigItems, makePkgconfigItem }:
stdenv.mkDerivation {
stdenv.mkDerivation rec {
pname = "stb";
version = "unstable-2021-09-10";
@ -11,11 +11,28 @@ stdenv.mkDerivation {
sha256 = "0qq35cd747lll4s7bmnxb3pqvyp2hgcr9kyf758fax9lx76iwjhr";
};
nativeBuildInputs = [ copyPkgconfigItems ];
pkgconfigItems = [
(makePkgconfigItem rec {
name = "stb";
version = "1";
cflags = [ "-I${variables.includedir}/stb" ];
variables = rec {
prefix = "${placeholder "out"}";
includedir = "${prefix}/include";
};
inherit (meta) description;
})
];
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/include/stb
cp *.h $out/include/stb/
runHook postInstall
'';
meta = with lib; {

View file

@ -828,6 +828,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 { };