Skip to content

Commit

Permalink
pkg-config-wrapper: Init
Browse files Browse the repository at this point in the history
This fixes longstanding build issues
  • Loading branch information
Ericson2314 committed May 16, 2020
1 parent 27edd9e commit c71ab32
Show file tree
Hide file tree
Showing 9 changed files with 208 additions and 12 deletions.
12 changes: 12 additions & 0 deletions pkgs/build-support/pkg-config-wrapper/add-flags.sh
@@ -0,0 +1,12 @@
# See cc-wrapper for comments.
var_templates_list=(
PKG_CONFIG_PATH
)

accumulateRoles

for var in "${var_templates_list[@]}"; do
mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"}
done

export NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@=1
117 changes: 117 additions & 0 deletions pkgs/build-support/pkg-config-wrapper/default.nix
@@ -0,0 +1,117 @@
# The wrapper script ensures variables like PKG_CONFIG_PATH and
# PKG_CONFIG_PATH_FOR_BUILD work properly.

{ stdenvNoCC
, buildPackages
, pkg-config
, propagateDoc ? pkg-config != null && pkg-config ? man
, extraPackages ? [], extraBuildCommands ? ""
}:

with stdenvNoCC.lib;

let
stdenv = stdenvNoCC;
inherit (stdenv) hostPlatform targetPlatform;

# Prefix for binaries. Customarily ends with a dash separator.
#
# TODO(@Ericson2314) Make unconditional, or optional but always true by
# default.
targetPrefix = stdenv.lib.optionalString (targetPlatform != hostPlatform)
(targetPlatform.config + "-");

# See description in cc-wrapper.
suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config;

in

stdenv.mkDerivation {
pname = targetPrefix + pkg-config.pname + "-wrapper";
inherit (pkg-config) version;

preferLocalBuild = true;

shell = getBin stdenvNoCC.shell + stdenvNoCC.shell.shellPath or "";

inherit targetPrefix suffixSalt;

outputs = [ "out" ] ++ optionals propagateDoc [ "man" ];

passthru = {
inherit pkg-config;
};

dontBuild = true;
dontConfigure = true;

unpackPhase = ''
src=$PWD
'';

installPhase =
''
mkdir -p $out/bin $out/nix-support
wrap() {
local dst="$1"
local wrapper="$2"
export prog="$3"
substituteAll "$wrapper" "$out/bin/$dst"
chmod +x "$out/bin/$dst"
}
echo $pkg-config > $out/nix-support/orig-pkg-config
wrap ${targetPrefix}pkg-config ${./pkg-config-wrapper.sh} "${getBin pkg-config}/bin/pkg-config"
'';

strictDeps = true;

wrapperName = "PKG_CONFIG_WRAPPER";

setupHooks = [
../setup-hooks/role.bash
./setup-hook.sh
];

postFixup =
''
##
## User env support
##
# Propagate the underling unwrapped pkg-config so that if you
# install the wrapper, you get anything else it might provide.
printWords ${pkg-config} > $out/nix-support/propagated-user-env-packages
''

+ optionalString propagateDoc ''
##
## Man page and info support
##
ln -s ${pkg-config.man} $man
''

+ ''
substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh
substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash
##
## Extra custom steps
##
''

+ extraBuildCommands;

meta =
let pkg-config_ = if pkg-config != null then pkg-config else {}; in
(if pkg-config_ ? meta then removeAttrs pkg-config.meta ["priority"] else {}) //
{ description =
stdenv.lib.attrByPath ["meta" "description"] "pkg-config" pkg-config_
+ " (wrapper script)";
priority = 10;
};
}
21 changes: 21 additions & 0 deletions pkgs/build-support/pkg-config-wrapper/pkg-config-wrapper.sh
@@ -0,0 +1,21 @@
#! @shell@
set -eu -o pipefail +o posix
shopt -s nullglob

if (( "${NIX_DEBUG:-0}" >= 7 )); then
set -x
fi

source @out@/nix-support/utils.bash

if [ -z "${NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then
source @out@/nix-support/add-flags.sh
fi

if (( ${#role_suffixes[@]} > 0 )); then
# replace env var with nix-modified one
PKG_CONFIG_PATH=$PKG_CONFIG_PATH_@suffixSalt@ exec @prog@ "$@"
else
# pkg-config isn't a bonafied dependency so ignore setup hook entirely
exec @prog@ "$@"
fi
29 changes: 29 additions & 0 deletions pkgs/build-support/pkg-config-wrapper/setup-hook.sh
@@ -0,0 +1,29 @@
# pkg-config Wrapper hygiene
#
# See comments in cc-wrapper's setup hook. This works exactly the same way.

# Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a
# native compile.
#
# TODO(@Ericson2314): No native exception
[[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0

pkgConfigWrapper_addPkgConfigPath () {
# See ../setup-hooks/role.bash
local role_post
getHostRoleEnvHook

addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/lib/pkgconfig"
addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/share/pkgconfig"
}

# See ../setup-hooks/role.bash
getTargetRole
getTargetRoleWrapper

addEnvHooks "$targetOffset" pkgConfigWrapper_addPkgConfigPath

export PKG_CONFIG${role_post}=@targetPrefix@pkg-config

# No local scope in sourced file
unset -v role_post
2 changes: 1 addition & 1 deletion pkgs/development/python-modules/pkgconfig/default.nix
Expand Up @@ -4,7 +4,7 @@ buildPythonPackage rec {
pname = "pkgconfig";
version = "1.5.1";

setupHook = pkgconfig.setupHook;
setupHooks = pkgconfig.setupHooks;

src = fetchPypi {
inherit pname version;
Expand Down
2 changes: 0 additions & 2 deletions pkgs/development/tools/misc/pkg-config/default.nix
Expand Up @@ -6,8 +6,6 @@ stdenv.mkDerivation rec {
pname = "pkg-config";
version = "0.29.2";

setupHook = ./setup-hook.sh;

src = fetchurl {
url = "https://pkgconfig.freedesktop.org/releases/${pname}-${version}.tar.gz";
sha256 = "14fmwzki1rlz8bs2p810lk6jqdxsk966d8drgsjmi54cd00rrikg";
Expand Down
6 changes: 0 additions & 6 deletions pkgs/development/tools/misc/pkg-config/setup-hook.sh

This file was deleted.

14 changes: 14 additions & 0 deletions pkgs/test/cross/default.nix
Expand Up @@ -91,6 +91,20 @@ let
pkgFun = pkgs: pkgs.hello;
};

pkg-config = {platformFun, crossPkgs, emulator}: crossPkgs.runCommand
"test-pkg-config-${crossPkgs.hostPlatform.config}"
{
depsBuildBuild = [ crossPkgs.pkgsBuildBuild.pkg-config ];
nativeBuildInputs = [ crossPkgs.pkgsBuildHost.pkg-config crossPkgs.buildPackages.zlib ];
depsBuildTarget = [ crossPkgs.pkgsBuildTarget.pkg-config ];
buildInputs = [ crossPkgs.zlib ];
NIX_DEBUG = 7;
} ''
mkdir $out
${crossPkgs.pkgsBuildBuild.pkg-config.targetPrefix}pkg-config --cflags zlib > "$out/for-build"
${crossPkgs.pkgsBuildHost.pkg-config.targetPrefix}pkg-config --cflags zlib > "$out/for-host"
! diff "$out/for-build" "$out/for-host"
'';
};

in {
Expand Down
17 changes: 14 additions & 3 deletions pkgs/top-level/all-packages.nix
Expand Up @@ -329,7 +329,11 @@ in
# break dependency cycles
fetchurl = stdenv.fetchurlBoot;
zlib = buildPackages.zlib.override { fetchurl = stdenv.fetchurlBoot; };
pkgconfig = buildPackages.pkgconfig.override { fetchurl = stdenv.fetchurlBoot; };
pkgconfig = buildPackages.pkgconfig.override (old: {
pkg-config = old.pkg-config.override {
fetchurl = stdenv.fetchurlBoot;
};
});
perl = buildPackages.perl.override { fetchurl = stdenv.fetchurlBoot; };
openssl = buildPackages.openssl.override {
fetchurl = stdenv.fetchurlBoot;
Expand Down Expand Up @@ -10737,10 +10741,17 @@ in

pkgconf = callPackage ../development/tools/misc/pkgconf {};

pkg-config = callPackage ../development/tools/misc/pkg-config { };
pkg-config-unwrapped = callPackage ../development/tools/misc/pkg-config { };
pkg-config = callPackage ../build-support/pkg-config-wrapper {
pkg-config = pkg-config-unwrapped;
};
pkgconfig = pkg-config; # added 2018-02-02

pkg-configUpstream = lowPrio (pkg-config.override { vanilla = true; });
pkg-configUpstream = lowPrio (pkg-config.override (old: {
pkg-config = old.pkg-config.override {
vanilla = true;
};
}));
pkgconfigUpstream = pkg-configUpstream; # added 2018-02-02

inherit (nodePackages) postcss-cli;
Expand Down

0 comments on commit c71ab32

Please sign in to comment.