pkg-config-wrapper: Init

This fixes longstanding build issues

+208 -12
+12
pkgs/build-support/pkg-config-wrapper/add-flags.sh
··· 1 + # See cc-wrapper for comments. 2 + var_templates_list=( 3 + PKG_CONFIG_PATH 4 + ) 5 + 6 + accumulateRoles 7 + 8 + for var in "${var_templates_list[@]}"; do 9 + mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"} 10 + done 11 + 12 + export NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@=1
+117
pkgs/build-support/pkg-config-wrapper/default.nix
··· 1 + # The wrapper script ensures variables like PKG_CONFIG_PATH and 2 + # PKG_CONFIG_PATH_FOR_BUILD work properly. 3 + 4 + { stdenvNoCC 5 + , buildPackages 6 + , pkg-config 7 + , propagateDoc ? pkg-config != null && pkg-config ? man 8 + , extraPackages ? [], extraBuildCommands ? "" 9 + }: 10 + 11 + with stdenvNoCC.lib; 12 + 13 + let 14 + stdenv = stdenvNoCC; 15 + inherit (stdenv) hostPlatform targetPlatform; 16 + 17 + # Prefix for binaries. Customarily ends with a dash separator. 18 + # 19 + # TODO(@Ericson2314) Make unconditional, or optional but always true by 20 + # default. 21 + targetPrefix = stdenv.lib.optionalString (targetPlatform != hostPlatform) 22 + (targetPlatform.config + "-"); 23 + 24 + # See description in cc-wrapper. 25 + suffixSalt = replaceStrings ["-" "."] ["_" "_"] targetPlatform.config; 26 + 27 + in 28 + 29 + stdenv.mkDerivation { 30 + pname = targetPrefix + pkg-config.pname + "-wrapper"; 31 + inherit (pkg-config) version; 32 + 33 + preferLocalBuild = true; 34 + 35 + shell = getBin stdenvNoCC.shell + stdenvNoCC.shell.shellPath or ""; 36 + 37 + inherit targetPrefix suffixSalt; 38 + 39 + outputs = [ "out" ] ++ optionals propagateDoc [ "man" ]; 40 + 41 + passthru = { 42 + inherit pkg-config; 43 + }; 44 + 45 + dontBuild = true; 46 + dontConfigure = true; 47 + 48 + unpackPhase = '' 49 + src=$PWD 50 + ''; 51 + 52 + installPhase = 53 + '' 54 + mkdir -p $out/bin $out/nix-support 55 + 56 + wrap() { 57 + local dst="$1" 58 + local wrapper="$2" 59 + export prog="$3" 60 + substituteAll "$wrapper" "$out/bin/$dst" 61 + chmod +x "$out/bin/$dst" 62 + } 63 + 64 + echo $pkg-config > $out/nix-support/orig-pkg-config 65 + 66 + wrap ${targetPrefix}pkg-config ${./pkg-config-wrapper.sh} "${getBin pkg-config}/bin/pkg-config" 67 + ''; 68 + 69 + strictDeps = true; 70 + 71 + wrapperName = "PKG_CONFIG_WRAPPER"; 72 + 73 + setupHooks = [ 74 + ../setup-hooks/role.bash 75 + ./setup-hook.sh 76 + ]; 77 + 78 + postFixup = 79 + '' 80 + 81 + ## 82 + ## User env support 83 + ## 84 + 85 + # Propagate the underling unwrapped pkg-config so that if you 86 + # install the wrapper, you get anything else it might provide. 87 + printWords ${pkg-config} > $out/nix-support/propagated-user-env-packages 88 + '' 89 + 90 + + optionalString propagateDoc '' 91 + ## 92 + ## Man page and info support 93 + ## 94 + 95 + ln -s ${pkg-config.man} $man 96 + '' 97 + 98 + + '' 99 + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh 100 + substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash 101 + 102 + ## 103 + ## Extra custom steps 104 + ## 105 + '' 106 + 107 + + extraBuildCommands; 108 + 109 + meta = 110 + let pkg-config_ = if pkg-config != null then pkg-config else {}; in 111 + (if pkg-config_ ? meta then removeAttrs pkg-config.meta ["priority"] else {}) // 112 + { description = 113 + stdenv.lib.attrByPath ["meta" "description"] "pkg-config" pkg-config_ 114 + + " (wrapper script)"; 115 + priority = 10; 116 + }; 117 + }
+21
pkgs/build-support/pkg-config-wrapper/pkg-config-wrapper.sh
··· 1 + #! @shell@ 2 + set -eu -o pipefail +o posix 3 + shopt -s nullglob 4 + 5 + if (( "${NIX_DEBUG:-0}" >= 7 )); then 6 + set -x 7 + fi 8 + 9 + source @out@/nix-support/utils.bash 10 + 11 + if [ -z "${NIX_PKG_CONFIG_WRAPPER_FLAGS_SET_@suffixSalt@:-}" ]; then 12 + source @out@/nix-support/add-flags.sh 13 + fi 14 + 15 + if (( ${#role_suffixes[@]} > 0 )); then 16 + # replace env var with nix-modified one 17 + PKG_CONFIG_PATH=$PKG_CONFIG_PATH_@suffixSalt@ exec @prog@ "$@" 18 + else 19 + # pkg-config isn't a bonafied dependency so ignore setup hook entirely 20 + exec @prog@ "$@" 21 + fi
+29
pkgs/build-support/pkg-config-wrapper/setup-hook.sh
··· 1 + # pkg-config Wrapper hygiene 2 + # 3 + # See comments in cc-wrapper's setup hook. This works exactly the same way. 4 + 5 + # Skip setup hook if we're neither a build-time dep, nor, temporarily, doing a 6 + # native compile. 7 + # 8 + # TODO(@Ericson2314): No native exception 9 + [[ -z ${strictDeps-} ]] || (( "$hostOffset" < 0 )) || return 0 10 + 11 + pkgConfigWrapper_addPkgConfigPath () { 12 + # See ../setup-hooks/role.bash 13 + local role_post 14 + getHostRoleEnvHook 15 + 16 + addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/lib/pkgconfig" 17 + addToSearchPath "PKG_CONFIG_PATH${role_post}" "$1/share/pkgconfig" 18 + } 19 + 20 + # See ../setup-hooks/role.bash 21 + getTargetRole 22 + getTargetRoleWrapper 23 + 24 + addEnvHooks "$targetOffset" pkgConfigWrapper_addPkgConfigPath 25 + 26 + export PKG_CONFIG${role_post}=@targetPrefix@pkg-config 27 + 28 + # No local scope in sourced file 29 + unset -v role_post
+1 -1
pkgs/development/python-modules/pkgconfig/default.nix
··· 4 4 pname = "pkgconfig"; 5 5 version = "1.5.1"; 6 6 7 - setupHook = pkgconfig.setupHook; 7 + setupHooks = pkgconfig.setupHooks; 8 8 9 9 src = fetchPypi { 10 10 inherit pname version;
-2
pkgs/development/tools/misc/pkg-config/default.nix
··· 6 6 pname = "pkg-config"; 7 7 version = "0.29.2"; 8 8 9 - setupHook = ./setup-hook.sh; 10 - 11 9 src = fetchurl { 12 10 url = "https://pkgconfig.freedesktop.org/releases/${pname}-${version}.tar.gz"; 13 11 sha256 = "14fmwzki1rlz8bs2p810lk6jqdxsk966d8drgsjmi54cd00rrikg";
-6
pkgs/development/tools/misc/pkg-config/setup-hook.sh
··· 1 - addPkgConfigPath () { 2 - addToSearchPath PKG_CONFIG_PATH $1/lib/pkgconfig 3 - addToSearchPath PKG_CONFIG_PATH $1/share/pkgconfig 4 - } 5 - 6 - addEnvHooks "$targetOffset" addPkgConfigPath
+14
pkgs/test/cross/default.nix
··· 91 91 pkgFun = pkgs: pkgs.hello; 92 92 }; 93 93 94 + pkg-config = {platformFun, crossPkgs, emulator}: crossPkgs.runCommand 95 + "test-pkg-config-${crossPkgs.hostPlatform.config}" 96 + { 97 + depsBuildBuild = [ crossPkgs.pkgsBuildBuild.pkg-config ]; 98 + nativeBuildInputs = [ crossPkgs.pkgsBuildHost.pkg-config crossPkgs.buildPackages.zlib ]; 99 + depsBuildTarget = [ crossPkgs.pkgsBuildTarget.pkg-config ]; 100 + buildInputs = [ crossPkgs.zlib ]; 101 + NIX_DEBUG = 7; 102 + } '' 103 + mkdir $out 104 + ${crossPkgs.pkgsBuildBuild.pkg-config.targetPrefix}pkg-config --cflags zlib > "$out/for-build" 105 + ${crossPkgs.pkgsBuildHost.pkg-config.targetPrefix}pkg-config --cflags zlib > "$out/for-host" 106 + ! diff "$out/for-build" "$out/for-host" 107 + ''; 94 108 }; 95 109 96 110 in {
+14 -3
pkgs/top-level/all-packages.nix
··· 329 329 # break dependency cycles 330 330 fetchurl = stdenv.fetchurlBoot; 331 331 zlib = buildPackages.zlib.override { fetchurl = stdenv.fetchurlBoot; }; 332 - pkgconfig = buildPackages.pkgconfig.override { fetchurl = stdenv.fetchurlBoot; }; 332 + pkgconfig = buildPackages.pkgconfig.override (old: { 333 + pkg-config = old.pkg-config.override { 334 + fetchurl = stdenv.fetchurlBoot; 335 + }; 336 + }); 333 337 perl = buildPackages.perl.override { fetchurl = stdenv.fetchurlBoot; }; 334 338 openssl = buildPackages.openssl.override { 335 339 fetchurl = stdenv.fetchurlBoot; ··· 10737 10741 10738 10742 pkgconf = callPackage ../development/tools/misc/pkgconf {}; 10739 10743 10740 - pkg-config = callPackage ../development/tools/misc/pkg-config { }; 10744 + pkg-config-unwrapped = callPackage ../development/tools/misc/pkg-config { }; 10745 + pkg-config = callPackage ../build-support/pkg-config-wrapper { 10746 + pkg-config = pkg-config-unwrapped; 10747 + }; 10741 10748 pkgconfig = pkg-config; # added 2018-02-02 10742 10749 10743 - pkg-configUpstream = lowPrio (pkg-config.override { vanilla = true; }); 10750 + pkg-configUpstream = lowPrio (pkg-config.override (old: { 10751 + pkg-config = old.pkg-config.override { 10752 + vanilla = true; 10753 + }; 10754 + })); 10744 10755 pkgconfigUpstream = pkg-configUpstream; # added 2018-02-02 10745 10756 10746 10757 inherit (nodePackages) postcss-cli;