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 })