1{ 2 lib, 3 stdenv, 4 buildPackages, 5 targetPackages, 6 gobject-introspection-unwrapped, 7 ... 8}@_args: 9 10# to build, run 11# `nix build ".#pkgsCross.aarch64-multiplatform.buildPackages.gobject-introspection"` 12 13# a comment for both depsTargetTargetPropagated's 14# add self to buildInputs to avoid needing to add gobject-introspection to buildInputs in addition to nativeBuildInputs 15# builds use target-pkg-config to look for gobject-introspection instead of just looking for binaries in $PATH 16 17let 18 # ensure that `.override` works 19 args = builtins.removeAttrs _args [ 20 "buildPackages" 21 "targetPackages" 22 "gobject-introspection-unwrapped" 23 ]; 24 # passing this stdenv to `targetPackages...` breaks due to splicing not working in `.override`` 25 argsForTarget = builtins.removeAttrs args [ "stdenv" ]; 26 27 overriddenUnwrappedGir = gobject-introspection-unwrapped.override args; 28 # if we have targetPackages.gobject-introspection then propagate that 29 overridenTargetUnwrappedGir = 30 if targetPackages ? gobject-introspection-unwrapped then 31 targetPackages.gobject-introspection-unwrapped.override argsForTarget 32 else 33 overriddenUnwrappedGir; 34in 35 36# wrap both pkgsCrossX.buildPackages.gobject-introspection and {pkgs,pkgsSomethingExecutableOnBuildSystem).buildPackages.gobject-introspection 37if 38 (!stdenv.hostPlatform.canExecute stdenv.targetPlatform) 39 && stdenv.targetPlatform.emulatorAvailable buildPackages 40then 41 overriddenUnwrappedGir.overrideAttrs (previousAttrs: { 42 43 pname = "gobject-introspection-wrapped"; 44 passthru = previousAttrs.passthru // { 45 unwrapped = overriddenUnwrappedGir; 46 }; 47 dontStrip = true; 48 depsTargetTargetPropagated = [ overridenTargetUnwrappedGir ]; 49 buildCommand = '' 50 eval fixupPhase 51 ${lib.concatMapStrings (output: '' 52 mkdir -p ${"$" + "${output}"} 53 ${lib.getExe buildPackages.xorg.lndir} ${overriddenUnwrappedGir.${output}} ${"$" + "${output}"} 54 '') overriddenUnwrappedGir.outputs} 55 56 cp $dev/bin/g-ir-compiler $dev/bin/.g-ir-compiler-wrapped 57 cp $dev/bin/g-ir-scanner $dev/bin/.g-ir-scanner-wrapped 58 59 ( 60 rm "$dev/bin/g-ir-compiler" 61 rm "$dev/bin/g-ir-scanner" 62 export bash="${buildPackages.bash}" 63 export emulator=${lib.escapeShellArg (stdenv.targetPlatform.emulator buildPackages)} 64 export emulatorwrapper="$dev/bin/g-ir-scanner-qemuwrapper" 65 export buildlddtree="${buildPackages.pax-utils}/bin/lddtree" 66 67 export targetgir="${lib.getDev overridenTargetUnwrappedGir}" 68 69 substituteAll "${./wrappers/g-ir-compiler.sh}" "$dev/bin/g-ir-compiler" 70 substituteAll "${./wrappers/g-ir-scanner.sh}" "$dev/bin/g-ir-scanner" 71 substituteAll "${./wrappers/g-ir-scanner-lddwrapper.sh}" "$dev/bin/g-ir-scanner-lddwrapper" 72 substituteAll "${./wrappers/g-ir-scanner-qemuwrapper.sh}" "$dev/bin/g-ir-scanner-qemuwrapper" 73 chmod +x $dev/bin/g-ir-compiler 74 chmod +x $dev/bin/g-ir-scanner* 75 ) 76 '' 77 # when cross-compiling and using the wrapper then when a package looks up the g_ir_X 78 # variable with pkg-config they'll get the host version which can't be run 79 # override the variable to use the absolute path to g_ir_X in PATH which can be run 80 + '' 81 cat >> $dev/nix-support/setup-hook <<-'EOF' 82 override-pkg-config-gir-variables() { 83 PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER="$(type -p g-ir-scanner)" 84 PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER="$(type -p g-ir-compiler)" 85 PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE="$(type -p g-ir-generate)" 86 export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_SCANNER 87 export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_COMPILER 88 export PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_G_IR_GENERATE 89 } 90 91 preConfigureHooks+=(override-pkg-config-gir-variables) 92 EOF 93 ''; 94 }) 95else 96 overriddenUnwrappedGir.overrideAttrs (previousAttrs: { 97 pname = "gobject-introspection-wrapped"; 98 passthru = previousAttrs.passthru // { 99 unwrapped = overriddenUnwrappedGir; 100 }; 101 dontStrip = true; 102 # Conditional is for `pkgsCross.x86_64-freebsd.pkgsBuildHost.gobject-introspection` `error: Don't know how to run x86_64-unknown-freebsd executables.` 103 # `pkgsCross.x86_64-freebsd.buildPackages.python3.withPackages (pp: [ pp.pygobject3 ])` 104 # Using the python module does not need this propagation 105 depsTargetTargetPropagated = lib.optionals (stdenv.targetPlatform.emulatorAvailable buildPackages) [ 106 overridenTargetUnwrappedGir 107 ]; 108 buildCommand = '' 109 eval fixupPhase 110 ${lib.concatMapStrings (output: '' 111 mkdir -p ${"$" + "${output}"} 112 ${lib.getExe buildPackages.xorg.lndir} ${overriddenUnwrappedGir.${output}} ${"$" + "${output}"} 113 '') overriddenUnwrappedGir.outputs} 114 ''; 115 })