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
main
Artturin 2 years ago
parent 163ffce31d
commit 79d349b087
  1. 17
      pkgs/development/libraries/gobject-introspection/default.nix
  2. 30
      pkgs/development/libraries/gobject-introspection/giscanner-ignore-error-return-codes-from-ldd-wrapper.patch
  3. 29
      pkgs/development/libraries/gobject-introspection/wrapper.nix
  4. 4
      pkgs/development/libraries/gobject-introspection/wrappers/g-ir-compiler.sh
  5. 7
      pkgs/development/libraries/gobject-introspection/wrappers/g-ir-scanner.sh
  6. 5
      pkgs/top-level/all-packages.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,

@ -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

@ -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"
)
'';
})

@ -0,0 +1,4 @@
#! @bash@
# shellcheck shell=bash
exec @emulator@ @targetgir@/bin/g-ir-compiler "$@"

@ -0,0 +1,7 @@
#! @bash@
# shellcheck shell=bash
exec @dev@/bin/.g-ir-scanner-wrapped \
--use-binary-wrapper=@emulator@ \
--use-ldd-wrapper=@buildprelink@ \
"$@"

@ -17585,7 +17585,10 @@ with pkgs;
gns3-gui = gns3Packages.guiStable;
gns3-server = gns3Packages.serverStable;
gobject-introspection = callPackage ../development/libraries/gobject-introspection {
gobject-introspection = if (stdenv.hostPlatform != stdenv.targetPlatform)
then callPackage ../development/libraries/gobject-introspection/wrapper.nix { } else gobject-introspection-unwrapped;
gobject-introspection-unwrapped = callPackage ../development/libraries/gobject-introspection {
nixStoreDir = config.nix.storeDir or builtins.storeDir;
inherit (darwin) cctools;
};

Loading…
Cancel
Save