Merge pull request #178567 from Artturin/pkgconfignew
makePkgconfigItem: init new function to generate pc files
This commit is contained in:
commit
b73f704a2f
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
|
||||||
|
}
|
@ -1,6 +1,8 @@
|
|||||||
{ lib
|
{ lib
|
||||||
, stdenv
|
, stdenv
|
||||||
, fetchFromRepoOrCz
|
, fetchFromRepoOrCz
|
||||||
|
, copyPkgconfigItems
|
||||||
|
, makePkgconfigItem
|
||||||
, perl
|
, perl
|
||||||
, texinfo
|
, texinfo
|
||||||
, which
|
, which
|
||||||
@ -17,11 +19,32 @@ stdenv.mkDerivation rec {
|
|||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
copyPkgconfigItems
|
||||||
perl
|
perl
|
||||||
texinfo
|
texinfo
|
||||||
which
|
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 = ''
|
postPatch = ''
|
||||||
patchShebangs texi2pod.pl
|
patchShebangs texi2pod.pl
|
||||||
'';
|
'';
|
||||||
@ -43,17 +66,6 @@ stdenv.mkDerivation rec {
|
|||||||
configureFlagsArray+=("--elfinterp=$(< $NIX_CC/nix-support/dynamic-linker)")
|
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" ];
|
outputs = [ "out" "info" "man" ];
|
||||||
|
|
||||||
doCheck = true;
|
doCheck = true;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{ lib, stdenv, fetchFromGitHub }:
|
{ lib, stdenv, fetchFromGitHub, copyPkgconfigItems, makePkgconfigItem }:
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation rec {
|
||||||
pname = "stb";
|
pname = "stb";
|
||||||
version = "unstable-2021-09-10";
|
version = "unstable-2021-09-10";
|
||||||
|
|
||||||
@ -11,11 +11,28 @@ stdenv.mkDerivation {
|
|||||||
sha256 = "0qq35cd747lll4s7bmnxb3pqvyp2hgcr9kyf758fax9lx76iwjhr";
|
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;
|
dontBuild = true;
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
mkdir -p $out/include/stb
|
mkdir -p $out/include/stb
|
||||||
cp *.h $out/include/stb/
|
cp *.h $out/include/stb/
|
||||||
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
@ -828,6 +828,10 @@ with pkgs;
|
|||||||
|
|
||||||
makeDesktopItem = callPackage ../build-support/make-desktopitem { };
|
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 { };
|
makeDarwinBundle = callPackage ../build-support/make-darwin-bundle { };
|
||||||
|
|
||||||
makeAutostartItem = callPackage ../build-support/make-startupitem { };
|
makeAutostartItem = callPackage ../build-support/make-startupitem { };
|
||||||
|
Loading…
Reference in New Issue
Block a user