diff --git a/DEVELOPERS b/DEVELOPERS index 09927e22d9..24b68ebe11 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -31,6 +31,7 @@ F: package/audit/ F: package/busybox/ F: package/checkpolicy/ F: package/cppdb/ +F: package/gobject-introspection/ F: package/gstreamer1/gstreamer1/ F: package/gstreamer1/gstreamer1-mm/ F: package/gstreamer1/gst1-plugins-bad/ diff --git a/package/Config.in b/package/Config.in index 53cf280c8e..2edcee01a5 100644 --- a/package/Config.in +++ b/package/Config.in @@ -1773,6 +1773,7 @@ menu "Other" source "package/glibmm/Config.in" source "package/glm/Config.in" source "package/gmp/Config.in" + source "package/gobject-introspection/Config.in" source "package/gsl/Config.in" source "package/gtest/Config.in" source "package/jemalloc/Config.in" diff --git a/package/gobject-introspection/0001-Revert-an-incomplete-upstream-attempt-at-cross-compi.patch b/package/gobject-introspection/0001-Revert-an-incomplete-upstream-attempt-at-cross-compi.patch new file mode 100644 index 0000000000..1e8bd3518a --- /dev/null +++ b/package/gobject-introspection/0001-Revert-an-incomplete-upstream-attempt-at-cross-compi.patch @@ -0,0 +1,33 @@ +From 3a9d1e5ee0aae56fafec0beba2014c19e4ff310c Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Wed, 23 Mar 2016 17:07:28 +0200 +Subject: [PATCH] Revert an incomplete upstream attempt at cross-compile support + +Upstream-Status: Pending +Signed-off-by: Alexander Kanavin +Signed-off-by: Adam Duskett +--- + common.mk | 4 ---- + giscanner/gdumpparser.py | 6 ------ + 2 files changed, 10 deletions(-) + +diff --git a/giscanner/gdumpparser.py b/giscanner/gdumpparser.py +index 1134f33..9bdc2bc 100644 +--- a/giscanner/gdumpparser.py ++++ b/giscanner/gdumpparser.py +@@ -156,12 +156,6 @@ blob containing data gleaned from GObject's primitive introspection.""" + out_path = os.path.join(self._binary.tmpdir, 'dump.xml') + + args = [] +- +- # Prepend the launcher command and arguments, if defined +- launcher = os.environ.get('GI_CROSS_LAUNCHER') +- if launcher: +- args.extend(launcher.split()) +- + args.extend(self._binary.args) + args.append('--introspect-dump=%s,%s' % (in_path, out_path)) + +-- +2.7.0 + diff --git a/package/gobject-introspection/0002-add-cross-compilation-support-to-meson.patch b/package/gobject-introspection/0002-add-cross-compilation-support-to-meson.patch new file mode 100644 index 0000000000..5e3ac59dd9 --- /dev/null +++ b/package/gobject-introspection/0002-add-cross-compilation-support-to-meson.patch @@ -0,0 +1,163 @@ +From 2b3bce1526b538dc2c7fa223eaf9808858aa1b06 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Thu, 15 Nov 2018 15:10:05 +0100 +Subject: [PATCH] add cross-compilation support to meson + +Upstream-Status: Pending +Signed-off-by: Alexander Kanavin +Signed-off-by: Adam Duskett +--- + gir/meson.build | 62 ++++++++++++++++++++++++++++++++++------------- + meson.build | 4 ++- + meson_options.txt | 20 +++++++++++++++ + 3 files changed, 68 insertions(+), 18 deletions(-) + +diff --git a/gir/meson.build b/gir/meson.build +index 85ae575..327c134 100644 +--- a/gir/meson.build ++++ b/gir/meson.build +@@ -36,16 +36,29 @@ gir_files = [ + typelibdir = join_paths(get_option('libdir'), 'girepository-1.0') + install_data(gir_files, install_dir: girdir) + +-scanner_command = [ +- python, +- girscanner, +- '--output=@OUTPUT@', +- '--no-libtool', +- '--quiet', +- '--reparse-validate', +- '--add-include-path', join_paths(meson.current_build_dir()), +- '--add-include-path', join_paths(meson.current_source_dir()), +-] ++if get_option('enable-host-gi') ++ scanner_command = [ ++ 'g-ir-scanner', ++ '--output=@OUTPUT@', ++ '--no-libtool', ++ '--quiet', ++ '--reparse-validate', ++ '--add-include-path', join_paths(meson.current_build_dir()), ++ '--add-include-path', join_paths(meson.current_source_dir()), ++ ] ++else ++ scanner_command = [ ++ python, ++ girscanner, ++ '--output=@OUTPUT@', ++ '--no-libtool', ++ '--quiet', ++ '--reparse-validate', ++ '--add-include-path', join_paths(meson.current_build_dir()), ++ '--add-include-path', join_paths(meson.current_source_dir()), ++ ] ++endif ++ + + dep_type = glib_dep.type_name() + if dep_type == 'internal' +@@ -58,6 +71,12 @@ if dep_type == 'internal' + '--extra-library=glib-2.0', '--extra-library=gobject-2.0'] + endif + ++if get_option('enable-gi-cross-wrapper') != '' ++ scanner_command += ['--use-binary-wrapper=' + get_option('enable-gi-cross-wrapper')] ++endif ++if get_option('enable-gi-ldd-wrapper') != '' ++ scanner_command += ['--use-ldd-wrapper=' + get_option('enable-gi-ldd-wrapper')] ++endif + # Take a glob and print to newlines + globber = ''' + from glob import glob +@@ -84,8 +103,8 @@ glib_command = scanner_command + [ + + if dep_type == 'pkgconfig' + glib_command += ['--external-library', '--pkg=glib-2.0'] +- glib_libdir = glib_dep.get_pkgconfig_variable('libdir') +- glib_incdir = join_paths(glib_dep.get_pkgconfig_variable('includedir'), 'glib-2.0') ++ glib_libdir = get_option('pkgconfig-sysroot-path') + glib_dep.get_pkgconfig_variable('libdir') ++ glib_incdir = get_option('pkgconfig-sysroot-path') + join_paths(glib_dep.get_pkgconfig_variable('includedir'), 'glib-2.0') + glib_libincdir = join_paths(glib_libdir, 'glib-2.0', 'include') + glib_files += join_paths(glib_incdir, 'gobject', 'glib-types.h') + glib_files += join_paths(glib_libincdir, 'glibconfig.h') +@@ -339,7 +358,7 @@ endforeach + if giounix_dep.found() + if dep_type == 'pkgconfig' + gio_command += ['--pkg=gio-unix-2.0'] +- giounix_includedir = join_paths(giounix_dep.get_pkgconfig_variable('includedir'), 'gio-unix-2.0') ++ giounix_includedir = get_option('pkgconfig-sysroot-path') + join_paths(giounix_dep.get_pkgconfig_variable('includedir'), 'gio-unix-2.0') + # Get the installed gio-unix header list + ret = run_command(python, '-c', globber.format(join_paths(giounix_includedir, 'gio', '*.h'))) + if ret.returncode() != 0 +@@ -422,15 +441,24 @@ gir_files += custom_target('gir-girepository', + ) + + typelibs = [] ++if get_option('enable-gi-cross-wrapper') != '' ++ gircompiler_command = [get_option('enable-gi-cross-wrapper'), gircompiler.full_path(), '-o', '@OUTPUT@', '@INPUT@', ++ '--includedir', meson.current_build_dir(), ++ '--includedir', meson.current_source_dir(), ++ ] ++else ++ gircompiler_command = [gircompiler, '-o', '@OUTPUT@', '@INPUT@', ++ '--includedir', meson.current_build_dir(), ++ '--includedir', meson.current_source_dir(), ++ ] ++endif ++ + foreach gir : gir_files + typelibs += custom_target('generate-typelib-@0@'.format(gir).underscorify(), + input: gir, + output: '@BASENAME@.typelib', + depends: [gobject_gir, ], +- command: [gircompiler, '-o', '@OUTPUT@', '@INPUT@', +- '--includedir', meson.current_build_dir(), +- '--includedir', meson.current_source_dir(), +- ], ++ command: gircompiler_command, + install: true, + install_dir: typelibdir, + ) +diff --git a/meson.build b/meson.build +index 95bbd2b..f7baefd 100644 +--- a/meson.build ++++ b/meson.build +@@ -163,7 +163,9 @@ endif + subdir('girepository') + subdir('tools') + subdir('giscanner') +-subdir('gir') ++if get_option('enable-introspection-data') == true ++ subdir('gir') ++endif + subdir('examples') + subdir('docs') + subdir('tests') +diff --git a/meson_options.txt b/meson_options.txt +index 445a68a..a325511 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -25,3 +25,23 @@ option('python', type: 'string', value: 'python3', + option('gir_dir_prefix', type: 'string', + description: 'Intermediate prefix for gir installation under ${prefix}' + ) ++ ++option('enable-host-gi', type: 'boolean', value : false, ++ description: 'Use gobject introspection tools installed in the host system (useful when cross-compiling)' ++) ++ ++option('enable-gi-cross-wrapper', type: 'string', ++ description: 'Use a wrapper to run gicompiler and binaries produced by giscanner (useful when cross-compiling)' ++) ++ ++option('enable-gi-ldd-wrapper', type: 'string', ++ description: 'Use a ldd wrapper instead of system ldd command in giscanner (useful when cross-compiling)' ++) ++ ++option('enable-introspection-data', type: 'boolean', value : true, ++ description: 'Build introspection data (.gir and .typelib files) in addition to library and tools' ++) ++ ++option('pkgconfig-sysroot-path', type: 'string', ++ description: 'Specify a sysroot path to prepend to pkgconfig output (useful when cross-compiling)' ++) diff --git a/package/gobject-introspection/0003-disable-tests.patch b/package/gobject-introspection/0003-disable-tests.patch new file mode 100644 index 0000000000..fcc5a794f3 --- /dev/null +++ b/package/gobject-introspection/0003-disable-tests.patch @@ -0,0 +1,29 @@ +From 473b4288d8f4e891d0d21f7b60ef8053c5cd7af9 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Mon, 3 Feb 2020 10:07:15 -0800 +Subject: [PATCH] disable tests + +If introspection data on the host is not built, meson throws the error: +"Unknown variable "typelibs". Because tests are not required, removing +the subdir tests alltogether fixes this issue. + +Signed-off-by: Adam Duskett +--- + meson.build | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/meson.build b/meson.build +index a5e825f..981e936 100644 +--- a/meson.build ++++ b/meson.build +@@ -171,7 +171,6 @@ subdir('giscanner') + subdir('gir') + subdir('examples') + subdir('docs') +-subdir('tests') + + install_data('Makefile.introspection', install_dir: join_paths(get_option('datadir'), 'gobject-introspection-1.0')) + install_data('m4/introspection.m4', install_dir: join_paths(get_option('datadir'), 'aclocal')) +-- +2.24.1 + diff --git a/package/gobject-introspection/0004-giscanner-add-use-binary-wrapper-option.patch b/package/gobject-introspection/0004-giscanner-add-use-binary-wrapper-option.patch new file mode 100644 index 0000000000..cffc2d954d --- /dev/null +++ b/package/gobject-introspection/0004-giscanner-add-use-binary-wrapper-option.patch @@ -0,0 +1,52 @@ +From 704b888d0abfb01067352c40156f49f655691c7c Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Mon, 19 Oct 2015 18:26:40 +0300 +Subject: [PATCH] giscanner: add --use-binary-wrapper option + +With this option, giscanner will use a wrapper executable to run +binaries it's producing, instead of running them directly. This +is useful when binaries are cross-compiled and cannot be run directly, +but they can be run using for example QEMU emulation. + +Upstream-Status: Pending [review on oe-core list] +Signed-off-by: Alexander Kanavin +Signed-off-by: Adam Duskett +--- + giscanner/scannermain.py | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py +index 633496f..d684cd0 100755 +--- a/giscanner/scannermain.py ++++ b/giscanner/scannermain.py +@@ -120,6 +120,9 @@ def _get_option_parser(): + parser.add_option("", "--program", + action="store", dest="program", default=None, + help="program to execute") ++ parser.add_option("", "--use-binary-wrapper", ++ action="store", dest="wrapper", default=None, ++ help="wrapper to use for running programs (useful when cross-compiling)") + parser.add_option("", "--program-arg", + action="append", dest="program_args", default=[], + help="extra arguments to program") +@@ -417,6 +420,17 @@ def create_binary(transformer, options, args): + gdump_parser.get_error_quark_functions()) + + shlibs = resolve_shlibs(options, binary, options.libraries) ++ if options.wrapper: ++ # The wrapper needs the binary itself, not the libtool wrapper script, ++ # so we check if libtool has sneaked the binary into .libs subdirectory ++ # and adjust the path accordingly ++ import os.path ++ dir_name, binary_name = os.path.split(binary.args[0]) ++ libtool_binary = os.path.join(dir_name, '.libs', binary_name) ++ if os.path.exists(libtool_binary): ++ binary.args[0] = libtool_binary ++ # Then prepend the wrapper to the command line to execute ++ binary.args = [options.wrapper] + binary.args + gdump_parser.set_introspection_binary(binary) + gdump_parser.parse() + return shlibs +-- +2.7.0 + diff --git a/package/gobject-introspection/0005-giscanner-add-a-use-ldd-wrapper-option.patch b/package/gobject-introspection/0005-giscanner-add-a-use-ldd-wrapper-option.patch new file mode 100644 index 0000000000..386c1c34b0 --- /dev/null +++ b/package/gobject-introspection/0005-giscanner-add-a-use-ldd-wrapper-option.patch @@ -0,0 +1,48 @@ +From d4ad57fd4a32c4f0d2f0522a3090ef940746431b Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Fri, 30 Oct 2015 16:28:46 +0200 +Subject: [PATCH] giscanner: add a --use-ldd-wrapper option + +This is useful in cross-compile environments where system's ldd +command does not work on binaries built for a different architecture + +Upstream-Status: Pending [review in oe-core] +Signed-off-by: Alexander Kanavin +Signed-off-by: Adam Duskett +--- + giscanner/scannermain.py | 3 +++ + giscanner/shlibs.py | 4 +++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py +index d684cd0..1b3b369 100755 +--- a/giscanner/scannermain.py ++++ b/giscanner/scannermain.py +@@ -123,6 +123,9 @@ def _get_option_parser(): + parser.add_option("", "--use-binary-wrapper", + action="store", dest="wrapper", default=None, + help="wrapper to use for running programs (useful when cross-compiling)") ++ parser.add_option("", "--use-ldd-wrapper", ++ action="store", dest="ldd_wrapper", default=None, ++ help="wrapper to use instead of ldd (useful when cross-compiling)") + parser.add_option("", "--program-arg", + action="append", dest="program_args", default=[], + help="extra arguments to program") +diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py +index c93d20c..c5b5942 100644 +--- a/giscanner/shlibs.py ++++ b/giscanner/shlibs.py +@@ -97,7 +97,9 @@ def _resolve_non_libtool(options, binary, libraries): + args.extend(libtool) + args.append('--mode=execute') + platform_system = platform.system() +- if platform_system == 'Darwin': ++ if options.ldd_wrapper: ++ args.extend([options.ldd_wrapper, binary.args[0]]) ++ elif platform_system == 'Darwin': + args.extend(['otool', '-L', binary.args[0]]) + else: + args.extend(['ldd', binary.args[0]]) +-- +2.7.0 + diff --git a/package/gobject-introspection/0006-giscanner-add-a-lib-dirs-envvar-option.patch b/package/gobject-introspection/0006-giscanner-add-a-lib-dirs-envvar-option.patch new file mode 100644 index 0000000000..06f5635610 --- /dev/null +++ b/package/gobject-introspection/0006-giscanner-add-a-lib-dirs-envvar-option.patch @@ -0,0 +1,73 @@ +From 3a9b3d8179b7eb9d2cc93da31578945bc03a45c3 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Fri, 27 Apr 2018 12:56:15 -0400 +Subject: [PATCH] giscanner: add a --lib-dirs-envvar option + +By default LD_LIBRARY_PATH is set to the list of target library paths; +this breaks down in cross-compilation environment, as we need to run a +native emulation wrapper rather than the target binary itself. This patch +allows exporting those paths to a different environment variable +which can be picked up and used by the wrapper. + +Upstream-Status: Pending +Signed-off-by: Alexander Kanavin +Signed-off-by: Adam Duskett +--- + giscanner/ccompiler.py | 4 ++-- + giscanner/dumper.py | 3 ++- + giscanner/scannermain.py | 3 +++ + 3 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/giscanner/ccompiler.py b/giscanner/ccompiler.py +index d10327c..6cf25d5 100644 +--- a/giscanner/ccompiler.py ++++ b/giscanner/ccompiler.py +@@ -174,7 +174,7 @@ class CCompiler(object): + + self._cflags_no_deprecation_warnings = "-Wno-deprecated-declarations" + +- def get_internal_link_flags(self, args, libtool, libraries, extra_libraries, libpaths): ++ def get_internal_link_flags(self, args, libtool, libraries, extra_libraries, libpaths, lib_dirs_envvar): + # An "internal" link is where the library to be introspected + # is being built in the current directory. + +@@ -184,7 +184,7 @@ class CCompiler(object): + if os.name == 'nt': + runtime_path_envvar = ['LIB', 'PATH'] + else: +- runtime_path_envvar = ['LD_LIBRARY_PATH', 'DYLD_FALLBACK_LIBRARY_PATH'] ++ runtime_path_envvar = ['LD_LIBRARY_PATH', 'DYLD_FALLBACK_LIBRARY_PATH'] if not lib_dirs_envvar else [lib_dirs_envvar] + # Search the current directory first + # (This flag is not supported nor needed for Visual C++) + args.append('-L.') +diff --git a/giscanner/dumper.py b/giscanner/dumper.py +index 3c7220b..0abd565 100644 +--- a/giscanner/dumper.py ++++ b/giscanner/dumper.py +@@ -244,7 +244,8 @@ class DumpCompiler(object): + libtool, + self._options.libraries, + self._options.extra_libraries, +- self._options.library_paths) ++ self._options.library_paths, ++ self._options.lib_dirs_envvar) + args.extend(pkg_config_libs) + + else: +diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py +index d262785..51c9570 100755 +--- a/giscanner/scannermain.py ++++ b/giscanner/scannermain.py +@@ -126,6 +126,9 @@ def _get_option_parser(): + parser.add_option("", "--use-ldd-wrapper", + action="store", dest="ldd_wrapper", default=None, + help="wrapper to use instead of ldd (useful when cross-compiling)") ++ parser.add_option("", "--lib-dirs-envvar", ++ action="store", dest="lib_dirs_envvar", default=None, ++ help="environment variable to write a list of library directories to (for running the transient binary), instead of standard LD_LIBRARY_PATH") + parser.add_option("", "--program-arg", + action="append", dest="program_args", default=[], + help="extra arguments to program") +-- +2.14.3 + diff --git a/package/gobject-introspection/0007-Add-rpath-links-to-ccompiler.patch b/package/gobject-introspection/0007-Add-rpath-links-to-ccompiler.patch new file mode 100644 index 0000000000..08835d3ecc --- /dev/null +++ b/package/gobject-introspection/0007-Add-rpath-links-to-ccompiler.patch @@ -0,0 +1,29 @@ +From 72a427bc50daee8f1ded0e9221e53dbbf2a80f08 Mon Sep 17 00:00:00 2001 +From: Adam Duskett +Date: Wed, 14 Mar 2018 12:07:10 -0400 +Subject: [PATCH] Add rpath links to ccompiler + +This patch allows gobject-introspection to process extra paths passed to the +compiler via the GIR_EXTRA_LIBS_PATH variable. + +Signed-off-by: Adam Duskett +--- + giscanner/ccompiler.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/giscanner/ccompiler.py b/giscanner/ccompiler.py +index a8bd5b1..51bb9bc 100644 +--- a/giscanner/ccompiler.py ++++ b/giscanner/ccompiler.py +@@ -229,6 +229,8 @@ class CCompiler(object): + + for envvar in runtime_path_envvar: + if envvar in os.environ: ++ for envvar_path in os.environ[envvar].split(':'): ++ args.append("-Wl,-rpath-link," + envvar_path) + os.environ[envvar] = \ + os.pathsep.join(runtime_paths + [os.environ[envvar]]) + else: +-- +2.14.3 + diff --git a/package/gobject-introspection/0008-ignore-error-return-codes-from-ldd-wrapper.patch b/package/gobject-introspection/0008-ignore-error-return-codes-from-ldd-wrapper.patch new file mode 100644 index 0000000000..568758d332 --- /dev/null +++ b/package/gobject-introspection/0008-ignore-error-return-codes-from-ldd-wrapper.patch @@ -0,0 +1,28 @@ +From f742da8b3913f4818d3f419117076afe62f4dbf4 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +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 +Signed-off-by: Adam Duskett +--- + giscanner/shlibs.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py +index d67df95..80352a6 100644 +--- a/giscanner/shlibs.py ++++ b/giscanner/shlibs.py +@@ -102,7 +102,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") + diff --git a/package/gobject-introspection/Config.in b/package/gobject-introspection/Config.in new file mode 100644 index 0000000000..0537cc0404 --- /dev/null +++ b/package/gobject-introspection/Config.in @@ -0,0 +1,32 @@ +config BR2_PACKAGE_GOBJECT_INTROSPECTION + bool "gobject-introspection" + depends on BR2_USE_MMU # python3, libglib2 + depends on BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS + # While gcc 4.8 might be compatible with gobject-introspection, + # The autobuilders use some toolchains from codesourcery which + # have gcc 4.8 and a very old version of glibc, which will cause + # compile errors with locale.c. As such, require 4.9 until this + # can be verified. + depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_9 + depends on BR2_TOOLCHAIN_USES_GLIBC + select BR2_PACKAGE_HOST_QEMU + select BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE + select BR2_PACKAGE_LIBFFI + select BR2_PACKAGE_LIBGLIB2 + select BR2_PACKAGE_PYTHON3 if !BR2_PACKAGE_PYTHON + select BR2_PACKAGE_ZLIB + help + GObject introspection is a middleware layer between C + libraries (using GObject) and language bindings. The C library + can be scanned at compile time and generate a metadata file, + in addition to the actual native C library. Then at runtime, + language bindings can read this metadata and automatically + provide bindings to call into the C library. + + https://wiki.gnome.org/action/show/Projects/GObjectIntrospection + +comment "gobject-introspection needs a glibc toolchain, gcc >= 4.9" + depends on BR2_USE_MMU + depends on BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS + depends on !BR2_TOOLCHAIN_USES_GLIBC || \ + !BR2_TOOLCHAIN_GCC_AT_LEAST_4_9 diff --git a/package/gobject-introspection/g-ir-compiler.in b/package/gobject-introspection/g-ir-compiler.in new file mode 100644 index 0000000000..02d7c15c38 --- /dev/null +++ b/package/gobject-introspection/g-ir-compiler.in @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +$(dirname $0)/g-ir-scanner-qemuwrapper $(dirname $0)/g-ir-compiler.real "$@" \ No newline at end of file diff --git a/package/gobject-introspection/g-ir-scanner-lddwrapper.in b/package/gobject-introspection/g-ir-scanner-lddwrapper.in new file mode 100644 index 0000000000..d7639c5c81 --- /dev/null +++ b/package/gobject-introspection/g-ir-scanner-lddwrapper.in @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +${HOST_DIR}/sbin/prelink-rtld --root=$(dirname $0)/../../ "$@" \ No newline at end of file diff --git a/package/gobject-introspection/g-ir-scanner-qemuwrapper.in b/package/gobject-introspection/g-ir-scanner-qemuwrapper.in new file mode 100644 index 0000000000..6e433eb300 --- /dev/null +++ b/package/gobject-introspection/g-ir-scanner-qemuwrapper.in @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# Pass -r to qemu-user as to trick glibc into not errorings out if the host kernel +# is older than the target kernel. +# Use a modules directory which does not exist so we don't load random things +# which may then get deleted (or their dependencies) and potentially segfault +GIO_MODULE_DIR=$(dirname $0)/../lib/gio/modules-dummy \ +@QEMU_USER@ -r @TOOLCHAIN_HEADERS_VERSION@ \ +-L $(dirname $0)/../../ \ +-E LD_LIBRARY_PATH=${GIR_EXTRA_LIBS_PATH}:.libs:$(dirname $0)/../lib:$(dirname $0)/../../lib \ +"$@" + +if [[ $? -ne 0 ]]; then + echo "If the above error message is about missing .so libraries, then setting up GIR_EXTRA_LIBS_PATH in the .mk file should help." + echo 'Typically like this: PKG_MAKE_ENV += GIR_EXTRA_LIBS_PATH="$(@D)/.libs"' + exit 1 +fi \ No newline at end of file diff --git a/package/gobject-introspection/g-ir-scanner.in b/package/gobject-introspection/g-ir-scanner.in new file mode 100644 index 0000000000..9f97497b7e --- /dev/null +++ b/package/gobject-introspection/g-ir-scanner.in @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +export GI_SCANNER_DISABLE_CACHE=1 +${HOST_DIR}/bin/g-ir-scanner \ +--lib-dirs-envvar=GIR_EXTRA_LIBS_PATH \ +--use-binary-wrapper=$(dirname $0)/g-ir-scanner-qemuwrapper \ +--use-ldd-wrapper=$(dirname $0)/g-ir-scanner-lddwrapper \ +--add-include-path=$(dirname $0)/../share/gir-1.0 "$@" diff --git a/package/gobject-introspection/gobject-introspection.hash b/package/gobject-introspection/gobject-introspection.hash new file mode 100644 index 0000000000..0454c59565 --- /dev/null +++ b/package/gobject-introspection/gobject-introspection.hash @@ -0,0 +1,4 @@ +#From http://ftp.gnome.org/pub/GNOME/sources/gobject-introspection/1.62/gobject-introspection-1.62.0.sha256sum +sha256 b1ee7ed257fdbc008702bdff0ff3e78a660e7e602efa8f211dc89b9d1e7d90a2 gobject-introspection-1.62.0.tar.xz +sha256 d245807f90032872d1438d741ed21e2490e1175dc8aa3afa5ddb6c8e529b58e5 COPYING.LGPL +sha256 32b1062f7da84967e7019d01ab805935caa7ab7321a7ced0e30ebe75e5df1670 COPYING.GPL diff --git a/package/gobject-introspection/gobject-introspection.mk b/package/gobject-introspection/gobject-introspection.mk new file mode 100644 index 0000000000..67e5e37dee --- /dev/null +++ b/package/gobject-introspection/gobject-introspection.mk @@ -0,0 +1,133 @@ +################################################################################ +# +# gobject-introspection +# +################################################################################ + +GOBJECT_INTROSPECTION_VERSION_MAJOR = 1.62 +GOBJECT_INTROSPECTION_VERSION = $(GOBJECT_INTROSPECTION_VERSION_MAJOR).0 +GOBJECT_INTROSPECTION_SITE = http://ftp.gnome.org/pub/GNOME/sources/gobject-introspection/$(GOBJECT_INTROSPECTION_VERSION_MAJOR) +GOBJECT_INTROSPECTION_SOURCE = gobject-introspection-$(GOBJECT_INTROSPECTION_VERSION).tar.xz +GOBJECT_INTROSPECTION_INSTALL_STAGING = YES +GOBJECT_INTROSPECTION_AUTORECONF = YES +GOBJECT_INTROSPECTION_LICENSE = LGPL-2.0+, GPL-2.0+, BSD-2-Clause +GOBJECT_INTROSPECTION_LICENSE_FILES = COPYING.LGPL COPYING.GPL giscanner/scannerlexer.l + +GOBJECT_INTROSPECTION_DEPENDENCIES = \ + host-autoconf-archive \ + host-gobject-introspection \ + host-prelink-cross \ + host-qemu \ + libffi \ + libglib2 \ + python3 \ + zlib + +HOST_GOBJECT_INTROSPECTION_DEPENDENCIES = \ + host-bison \ + host-flex \ + host-libglib2 \ + host-python3 + +# g-ir-scanner will default to /usr/bin/ld for linking if this is not set. +GOBJECT_INTROSPECTION_NINJA_ENV += \ + CC="$(TARGET_CC)" + +# Disable introspection data on the host, as it is not needed and +# the package will attempt to use the systems libglib2 which will fail +# if the systems libglib2 version is older than 2.60. +HOST_GOBJECT_INTROSPECTION_CONF_OPTS = \ + -Denable-introspection-data=false + +# Use the host gi-scanner to prevent the scanner from generating incorrect +# elf classes. +GOBJECT_INTROSPECTION_CONF_OPTS = \ + -Denable-host-gi=true \ + -Denable-gi-cross-wrapper="$(STAGING_DIR)/usr/bin/g-ir-scanner-qemuwrapper" \ + -Denable-gi-ldd-wrapper="$(STAGING_DIR)/usr/bin/g-ir-scanner-lddwrapper" \ + -Denable-introspection-data=true + +ifeq ($(BR2_PACKAGE_CAIRO),y) +GOBJECT_INTROSPECTION_DEPENDENCIES += cairo +GOBJECT_INTROSPECTION_CONF_OPTS += -Dcairo=true +endif + +# GI_SCANNER_DISABLE_CACHE=1 prevents g-ir-scanner from writing cache data to ${HOME} +GOBJECT_INTROSPECTION_CONF_ENV = \ + GI_SCANNER_DISABLE_CACHE=1 + +HOST_GOBJECT_INTROSPECTION_CONF_ENV = \ + GI_SCANNER_DISABLE_CACHE=1 + +# Make sure g-ir-tool-template uses the host python. +define GOBJECT_INTROSPECTION_FIX_TOOLTEMPLATE_PYTHON_PATH + $(SED) '1s%#!.*%#!$(HOST_DIR)/bin/python%' $(@D)/tools/g-ir-tool-template.in +endef +HOST_GOBJECT_INTROSPECTION_PRE_CONFIGURE_HOOKS += GOBJECT_INTROSPECTION_FIX_TOOLTEMPLATE_PYTHON_PATH + +# Perform the following: +# - Just as above, Ensure that g-ir-tool-template.in uses the host python. +# - Install all of the wrappers needed to build gobject-introspection. +# - Create a safe modules directory which does not exist so we don't load random things +# which may then get deleted (or their dependencies) and potentially segfault +define GOBJECT_INTROSPECTION_INSTALL_PRE_WRAPPERS + $(SED) '1s%#!.*%#!$(HOST_DIR)/bin/python%' $(@D)/tools/g-ir-tool-template.in + + $(INSTALL) -D -m 755 $(GOBJECT_INTROSPECTION_PKGDIR)/g-ir-scanner-lddwrapper.in \ + $(STAGING_DIR)/usr/bin/g-ir-scanner-lddwrapper + + $(INSTALL) -D -m 755 $(GOBJECT_INTROSPECTION_PKGDIR)/g-ir-scanner-qemuwrapper.in \ + $(STAGING_DIR)/usr/bin/g-ir-scanner-qemuwrapper + $(SED) "s%@QEMU_USER@%$(QEMU_USER)%g" \ + $(STAGING_DIR)/usr/bin/g-ir-scanner-qemuwrapper + $(SED) "s%@TOOLCHAIN_HEADERS_VERSION@%$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)%g" \ + $(STAGING_DIR)/usr/bin/g-ir-scanner-qemuwrapper + + # Use a modules directory which does not exist so we don't load random things + # which may then get deleted (or their dependencies) and potentially segfault + mkdir -p $(STAGING_DIR)/usr/lib/gio/modules-dummy +endef +GOBJECT_INTROSPECTION_PRE_CONFIGURE_HOOKS += GOBJECT_INTROSPECTION_INSTALL_PRE_WRAPPERS + +# Move the real compiler and scanner to .real, and replace them with the wrappers. +# Using .real has the following advantages: +# - There is no need to change the logic for other packages. +# - The wrappers call the .real files using qemu. +define GOBJECT_INTROSPECTION_INSTALL_WRAPPERS + # Move the real binaries to their names.real, then replace them with + # the wrappers. + $(foreach w,g-ir-compiler g-ir-scanner, + mv $(STAGING_DIR)/usr/bin/$(w) $(STAGING_DIR)/usr/bin/$(w).real + $(INSTALL) -D -m 755 \ + $(GOBJECT_INTROSPECTION_PKGDIR)/$(w).in $(STAGING_DIR)/usr/bin/$(w) + ) + # Gobject-introspection installs Makefile.introspection in + # $(STAGING_DIR)/usr/share which is needed for autotools-based programs to + # build .gir and .typelib files. Unfortuantly, gobject-introspection-1.0.pc + # uses $(prefix)/share as the directory, which + # causes the host /usr/share being used instead of $(STAGING_DIR)/usr/share. + # Change datarootdir to $(libdir)/../share which will prefix $(STAGING_DIR) + # to the correct location. + $(SED) "s%datarootdir=.*%datarootdir=\$${libdir}/../share%g" \ + $(STAGING_DIR)/usr/lib/pkgconfig/gobject-introspection-1.0.pc + + # By default, girdir and typelibdir use datadir and libdir as their prefix, + # of which pkg-config appends the sysroot directory. This results in files + # being installed in $(STAGING_DIR)/$(STAGING_DIR)/path/to/files. + # Changing the prefix to exec_prefix prevents this error. + $(SED) "s%girdir=.*%girdir=\$${exec_prefix}/share/gir-1.0%g" \ + $(STAGING_DIR)/usr/lib/pkgconfig/gobject-introspection-1.0.pc + + $(SED) "s%typelibdir=.*%typelibdir=\$${exec_prefix}/lib/girepository-1.0%g" \ + $(STAGING_DIR)/usr/lib/pkgconfig/gobject-introspection-1.0.pc +endef +GOBJECT_INTROSPECTION_POST_INSTALL_STAGING_HOOKS += GOBJECT_INTROSPECTION_INSTALL_WRAPPERS + +# Only .typelib files are needed to run. +define GOBJECT_INTROSPECTION_REMOVE_DEVELOPMENT_FILES + find $(TARGET_DIR)/usr/share \( -iname "*.gir" -o -iname \*.rnc \) -delete +endef +GOBJECT_INTROSPECTION_TARGET_FINALIZE_HOOKS += GOBJECT_INTROSPECTION_REMOVE_DEVELOPMENT_FILES + +$(eval $(meson-package)) +$(eval $(host-meson-package))