From b2f9cd34e75409bd7cd68a90f8754e63f92f4738 Mon Sep 17 00:00:00 2001 From: Artturin Date: Wed, 9 Nov 2022 00:33:42 +0200 Subject: [PATCH] gobject-introspection: use wrapper.nix for the native package too so we can propagate the dev output during the build of i3ipc-glib with strictDeps enabled i noticed that gobject-introspection was not being detected and it was due to gobject-introspection path not being in the PKG_CONFIG_PATH variable this commit makes gobject-introspection get detected when build==host --- .../gobject-introspection/default.nix | 8 -- .../gobject-introspection/wrapper.nix | 120 ++++++++++++------ pkgs/top-level/all-packages.nix | 3 +- 3 files changed, 84 insertions(+), 47 deletions(-) diff --git a/pkgs/development/libraries/gobject-introspection/default.nix b/pkgs/development/libraries/gobject-introspection/default.nix index bb306fb3a859..ec109cbee8dc 100644 --- a/pkgs/development/libraries/gobject-introspection/default.nix +++ b/pkgs/development/libraries/gobject-introspection/default.nix @@ -138,14 +138,6 @@ stdenv.mkDerivation (finalAttrs: { rm $out/lib/libregress-1.0${stdenv.targetPlatform.extensions.sharedLibrary} ''; - # add self to buildInputs to avoid needing to add gobject-introspection to buildInputs in addition to nativeBuildInputs - # builds use target-pkg-config to look for gobject-introspection instead of just looking for binaries in $PATH - # wrapper uses depsTargetTargetPropagated so ignore it - preFixup = lib.optionalString (!lib.hasSuffix "-wrapped" finalAttrs.pname) '' - mkdir -p $dev/nix-support - echo "$out" > $dev/nix-support/propagated-target-target-deps - ''; - setupHook = ./setup-hook.sh; passthru = { diff --git a/pkgs/development/libraries/gobject-introspection/wrapper.nix b/pkgs/development/libraries/gobject-introspection/wrapper.nix index f887b7d18c77..518dda781a64 100644 --- a/pkgs/development/libraries/gobject-introspection/wrapper.nix +++ b/pkgs/development/libraries/gobject-introspection/wrapper.nix @@ -9,50 +9,96 @@ # to build, run # `nix build ".#pkgsCross.aarch64-multiplatform.buildPackages.gobject-introspection"` +# a comment for both depsTargetTargetPropagated's +# add self to buildInputs to avoid needing to add gobject-introspection to buildInputs in addition to nativeBuildInputs +# builds use target-pkg-config to look for gobject-introspection instead of just looking for binaries in $PATH + let - # ensure that `.override` works when gobject-introspection == gobject-introspection-wrapped + # ensure that `.override` works args = builtins.removeAttrs _args [ "buildPackages" "targetPackages" "gobject-introspection-unwrapped" ]; # passing this stdenv to `targetPackages...` breaks due to splicing not working in `.override`` argsForTarget = builtins.removeAttrs args [ "stdenv" ]; + + overridenUnwrappedGir = gobject-introspection-unwrapped.override args; + # if we have targetPackages.gobject-introspection then propagate that + overridenTargetUnwrappedGir = + if targetPackages ? gobject-introspection-unwrapped + then targetPackages.gobject-introspection-unwrapped.override argsForTarget + else overridenUnwrappedGir; in -(gobject-introspection-unwrapped.override args).overrideAttrs (previousAttrs: { - pname = "gobject-introspection-wrapped"; - depsTargetTargetPropagated = [ gobject-introspection-unwrapped ]; - postFixup = (previousAttrs.postFixup or "") + '' - mv $dev/bin/g-ir-compiler $dev/bin/.g-ir-compiler-wrapped - mv $dev/bin/g-ir-scanner $dev/bin/.g-ir-scanner-wrapped +# wrap both pkgsCrossX.buildPackages.gobject-introspection and {pkgs,pkgsSomethingExecutableOnBuildSystem).buildPackages.gobject-introspection +if (!stdenv.hostPlatform.canExecute stdenv.targetPlatform) && stdenv.targetPlatform.emulatorAvailable buildPackages +then + stdenv.mkDerivation + (builtins.removeAttrs overridenUnwrappedGir.drvAttrs [ "name" ] # so we can get a fresh name generated from the pname + // { + pname = "gobject-introspection-wrapped"; + passthru = overridenUnwrappedGir.passthru // { + unwrapped = overridenUnwrappedGir; + }; + phases = [ "fixupPhase" ]; # don't remove, it is valid to set phases here. + dontStrip = true; + depsTargetTargetPropagated = [ overridenTargetUnwrappedGir ]; + postFixup = '' + ${lib.concatMapStrings (output: '' + mkdir -p ${"$" + "${output}"} + ${lib.getExe buildPackages.xorg.lndir} ${gobject-introspection-unwrapped.${output}} ${"$" + "${output}"} + '') gobject-introspection-unwrapped.outputs} - ( - export bash="${buildPackages.bash}" - export emulator=${lib.escapeShellArg (stdenv.targetPlatform.emulator buildPackages)} - export emulatorwrapper="$dev/bin/g-ir-scanner-qemuwrapper" - export buildlddtree="${buildPackages.pax-utils}/bin/lddtree" + cp $dev/bin/g-ir-compiler $dev/bin/.g-ir-compiler-wrapped + cp $dev/bin/g-ir-scanner $dev/bin/.g-ir-scanner-wrapped - export targetgir="${lib.getDev (targetPackages.gobject-introspection-unwrapped.override argsForTarget)}" + ( + rm "$dev/bin/g-ir-compiler" + rm "$dev/bin/g-ir-scanner" + export bash="${buildPackages.bash}" + export emulator=${lib.escapeShellArg (stdenv.targetPlatform.emulator buildPackages)} + export emulatorwrapper="$dev/bin/g-ir-scanner-qemuwrapper" + export buildlddtree="${buildPackages.pax-utils}/bin/lddtree" - substituteAll "${./wrappers/g-ir-compiler.sh}" "$dev/bin/g-ir-compiler" - substituteAll "${./wrappers/g-ir-scanner.sh}" "$dev/bin/g-ir-scanner" - substituteAll "${./wrappers/g-ir-scanner-lddwrapper.sh}" "$dev/bin/g-ir-scanner-lddwrapper" - substituteAll "${./wrappers/g-ir-scanner-qemuwrapper.sh}" "$dev/bin/g-ir-scanner-qemuwrapper" - chmod +x $dev/bin/g-ir-* - ) - '' - # when cross-compiling and using the wrapper then when a package looks up the g_ir_X - # variable with pkg-config they'll get the host version which can't be run - # override the variable to use the absolute path to g_ir_X in PATH which can be run - + '' - cat >> $dev/nix-support/setup-hook <<-'EOF' - override-pkg-config-gir-variables() { - PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER="$(type -p g-ir-scanner)" - PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER="$(type -p g-ir-compiler)" - PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE="$(type -p g-ir-generate)" - export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER - export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER - export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE - } + export targetgir="${lib.getDev overridenTargetUnwrappedGir}" - preConfigureHooks+=(override-pkg-config-gir-variables) - EOF - ''; -}) + substituteAll "${./wrappers/g-ir-compiler.sh}" "$dev/bin/g-ir-compiler" + substituteAll "${./wrappers/g-ir-scanner.sh}" "$dev/bin/g-ir-scanner" + substituteAll "${./wrappers/g-ir-scanner-lddwrapper.sh}" "$dev/bin/g-ir-scanner-lddwrapper" + substituteAll "${./wrappers/g-ir-scanner-qemuwrapper.sh}" "$dev/bin/g-ir-scanner-qemuwrapper" + chmod +x $dev/bin/g-ir-compiler + chmod +x $dev/bin/g-ir-scanner* + ) + '' + # when cross-compiling and using the wrapper then when a package looks up the g_ir_X + # variable with pkg-config they'll get the host version which can't be run + # override the variable to use the absolute path to g_ir_X in PATH which can be run + + '' + cat >> $dev/nix-support/setup-hook <<-'EOF' + override-pkg-config-gir-variables() { + PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER="$(type -p g-ir-scanner)" + PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER="$(type -p g-ir-compiler)" + PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE="$(type -p g-ir-generate)" + export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER + export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER + export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE + } + + preConfigureHooks+=(override-pkg-config-gir-variables) + EOF + ''; + }) +else + stdenv.mkDerivation (builtins.removeAttrs overridenUnwrappedGir.drvAttrs [ "name" ] # so we can get a fresh name generated from the pname + // { + pname = "gobject-introspection-wrapped"; + passthru = overridenUnwrappedGir.passthru // { + unwrapped = overridenUnwrappedGir; + }; + phases = [ "fixupPhase" ]; # don't remove, it is valid to set phases here. + dontStrip = true; + depsTargetTargetPropagated = [ overridenTargetUnwrappedGir ]; + postFixup = '' + ${lib.concatMapStrings (output: '' + mkdir -p ${"$" + "${output}"} + ${lib.getExe buildPackages.xorg.lndir} ${gobject-introspection-unwrapped.${output}} ${"$" + "${output}"} + '') gobject-introspection-unwrapped.outputs} + ''; + }) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 05d687b152e3..8d9015d76bb5 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -19174,8 +19174,7 @@ with pkgs; gns3-gui = gns3Packages.guiStable; gns3-server = gns3Packages.serverStable; - gobject-introspection = if (!stdenv.hostPlatform.canExecute stdenv.targetPlatform) && stdenv.targetPlatform.emulatorAvailable buildPackages - then callPackage ../development/libraries/gobject-introspection/wrapper.nix { } else gobject-introspection-unwrapped; + gobject-introspection = callPackage ../development/libraries/gobject-introspection/wrapper.nix { }; gobject-introspection-unwrapped = callPackage ../development/libraries/gobject-introspection { nixStoreDir = config.nix.storeDir or builtins.storeDir;