summary refs log tree commit diff
path: root/pkgs/development/libraries/gobject-introspection
diff options
context:
space:
mode:
authorArtturin <Artturin@artturin.com>2022-06-07 21:51:59 +0300
committerArtturin <Artturin@artturin.com>2022-06-11 04:51:18 +0300
commit79d349b0877cf22b693882c9a28f9052ae66cf2d (patch)
treee7872bc088f321720db3b9e25672f7e3865a98fa /pkgs/development/libraries/gobject-introspection
parent163ffce31d78d54fb95366bdebe3143f636f491c (diff)
gobject-introspection: support cross-compilation
used the following as references

https://github.com/void-linux/void-packages/blob/master/srcpkgs/gobject-introspection

and

https://git.busybox.net/buildroot/tree/package/gobject-introspection

thanks void and buildroot
Diffstat (limited to 'pkgs/development/libraries/gobject-introspection')
-rw-r--r--pkgs/development/libraries/gobject-introspection/default.nix17
-rw-r--r--pkgs/development/libraries/gobject-introspection/giscanner-ignore-error-return-codes-from-ldd-wrapper.patch30
-rw-r--r--pkgs/development/libraries/gobject-introspection/wrapper.nix29
-rw-r--r--pkgs/development/libraries/gobject-introspection/wrappers/g-ir-compiler.sh4
-rw-r--r--pkgs/development/libraries/gobject-introspection/wrappers/g-ir-scanner.sh7
5 files changed, 85 insertions, 2 deletions
diff --git a/pkgs/development/libraries/gobject-introspection/default.nix b/pkgs/development/libraries/gobject-introspection/default.nix
index b457331983aac..a0f4f22472d3b 100644
--- a/pkgs/development/libraries/gobject-introspection/default.nix
+++ b/pkgs/development/libraries/gobject-introspection/default.nix
@@ -17,6 +17,8 @@
 , cairo
 , gnome
 , substituteAll
+, buildPackages
+, gobject-introspection-unwrapped
 , nixStoreDir ? builtins.storeDir
 , x11Support ? true
 }:
@@ -40,6 +42,9 @@ stdenv.mkDerivation rec {
   };
 
   patches = [
+    # prelink-rtld, which we use for cross returns 127 when it can't find a library.
+    # https://git.busybox.net/buildroot/tree/package/gobject-introspection/0003-giscanner-ignore-error-return-codes-from-ldd-wrapper.patch
+    ./giscanner-ignore-error-return-codes-from-ldd-wrapper.patch
     # Make g-ir-scanner put absolute path to GIR files it generates
     # so that programs can just dlopen them without having to muck
     # with LD_LIBRARY_PATH environment variable.
@@ -67,7 +72,7 @@ stdenv.mkDerivation rec {
     docbook_xml_dtd_45
     python3
     setupHook # move .gir files
-  ];
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ gobject-introspection-unwrapped ];
 
   buildInputs = [
     python3
@@ -86,7 +91,11 @@ stdenv.mkDerivation rec {
     "--datadir=${placeholder "dev"}/share"
     "-Ddoctool=disabled"
     "-Dcairo=disabled"
-    "-Dgtk_doc=true"
+    "-Dgtk_doc=${lib.boolToString (stdenv.hostPlatform == stdenv.buildPlatform)}"
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    "-Dgi_cross_ldd_wrapper=${buildPackages.prelink}/bin/prelink-rtld"
+    "-Dgi_cross_use_prebuilt_gi=true"
+    "-Dgi_cross_binary_wrapper=${stdenv.hostPlatform.emulator buildPackages}"
   ];
 
   doCheck = !stdenv.isAarch64;
@@ -97,6 +106,10 @@ stdenv.mkDerivation rec {
     patchShebangs tools/*
   '';
 
+  postInstall = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+    cp -r ${buildPackages.gobject-introspection-unwrapped.devdoc} $devdoc
+  '';
+
   preCheck = ''
     # Our gobject-introspection patches make the shared library paths absolute
     # in the GIR files. When running tests, the library is not yet installed,
diff --git a/pkgs/development/libraries/gobject-introspection/giscanner-ignore-error-return-codes-from-ldd-wrapper.patch b/pkgs/development/libraries/gobject-introspection/giscanner-ignore-error-return-codes-from-ldd-wrapper.patch
new file mode 100644
index 0000000000000..fdcec4bc88c9b
--- /dev/null
+++ b/pkgs/development/libraries/gobject-introspection/giscanner-ignore-error-return-codes-from-ldd-wrapper.patch
@@ -0,0 +1,30 @@
+From e0fc4a2a5161a36483ddc518be9bb14390f11b19 Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex.kanavin@gmail.com>
+Date: Wed, 5 Sep 2018 16:46:52 +0200
+Subject: [PATCH] giscanner: ignore error return codes from ldd-wrapper
+
+prelink-rtld, which we use instead of ldd returns 127 when it can't find a library.
+It is not an error per se, but it breaks subprocess.check_output().
+
+Upstream-Status: Inappropriate [oe-core specific]
+Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
+Signed-off-by: Adam Duskett <aduskett@gmail.com>
+---
+ giscanner/shlibs.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py
+index 9f8ab5df..7a1a72fe 100644
+--- a/giscanner/shlibs.py
++++ b/giscanner/shlibs.py
+@@ -103,7 +103,7 @@ def _resolve_non_libtool(options, binary, libraries):
+             args.extend(['otool', '-L', binary.args[0]])
+         else:
+             args.extend(['ldd', binary.args[0]])
+-        output = subprocess.check_output(args)
++        output = subprocess.run(args, check=False, stdout=subprocess.PIPE).stdout
+         if isinstance(output, bytes):
+             output = output.decode("utf-8", "replace")
+
+--
+2.25.1
diff --git a/pkgs/development/libraries/gobject-introspection/wrapper.nix b/pkgs/development/libraries/gobject-introspection/wrapper.nix
new file mode 100644
index 0000000000000..44d31540e6456
--- /dev/null
+++ b/pkgs/development/libraries/gobject-introspection/wrapper.nix
@@ -0,0 +1,29 @@
+{ lib
+, stdenv
+, buildPackages
+, gobject-introspection-unwrapped
+, targetPackages
+}:
+
+# to build, run
+# `nix build ".#pkgsCross.aarch64-multiplatform.buildPackages.gobject-introspection"`
+gobject-introspection-unwrapped.overrideAttrs (_previousAttrs: {
+  pname = "gobject-introspection-wrapped";
+  postFixup = ''
+    mv $dev/bin/g-ir-compiler $dev/bin/.g-ir-compiler-wrapped
+    mv $dev/bin/g-ir-scanner $dev/bin/.g-ir-scanner-wrapped
+
+    (
+      export bash="${buildPackages.bash}/bin/bash"
+      export emulator=${lib.escapeShellArg (stdenv.targetPlatform.emulator buildPackages)}
+      export buildprelink="${buildPackages.prelink}/bin/prelink-rtld"
+
+      export targetgir="${lib.getDev targetPackages.gobject-introspection-unwrapped}"
+
+      substituteAll "${./wrappers/g-ir-compiler.sh}" "$dev/bin/g-ir-compiler"
+      substituteAll "${./wrappers/g-ir-scanner.sh}" "$dev/bin/g-ir-scanner"
+      chmod +x "$dev/bin/g-ir-compiler"
+      chmod +x "$dev/bin/g-ir-scanner"
+    )
+  '';
+})
diff --git a/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-compiler.sh b/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-compiler.sh
new file mode 100644
index 0000000000000..fde3dcfe0c008
--- /dev/null
+++ b/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-compiler.sh
@@ -0,0 +1,4 @@
+#! @bash@
+# shellcheck shell=bash
+
+exec @emulator@ @targetgir@/bin/g-ir-compiler "$@"
diff --git a/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-scanner.sh b/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-scanner.sh
new file mode 100644
index 0000000000000..0825f10e166e9
--- /dev/null
+++ b/pkgs/development/libraries/gobject-introspection/wrappers/g-ir-scanner.sh
@@ -0,0 +1,7 @@
+#! @bash@
+# shellcheck shell=bash
+
+exec @dev@/bin/.g-ir-scanner-wrapped \
+    --use-binary-wrapper=@emulator@ \
+    --use-ldd-wrapper=@buildprelink@ \
+    "$@"