kumquat-buildroot/package/gobject-introspection/gobject-introspection.mk
Adam Duskett 22d65321ec package/gobject-introspection: Add QEMU_USERMODE_ARGS support
Now that the qemu package has the BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS string,
the gobject-introspection g-ir-scanner-qemuwrapper script can pass that string
to qemu.

Add the QEMU_USERMODE_ARGS to g-ir-scanner-qemuwrapper.in and unconditionally
sed @QEMU_USERMODE_ARGS@ with BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS.

Fixes:
http://autobuild.buildroot.org/results/2e9dbc0d36600c09fa9e59ab1b1903c9f40661e8

Signed-off-by: Adam Duskett <aduskett@gmail.com>
[Arnout: don't add QEMU_USERMODE_ARGS variable to shell script]
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2021-09-11 21:31:36 +02:00

155 lines
6.8 KiB
Makefile

################################################################################
#
# gobject-introspection
#
################################################################################
GOBJECT_INTROSPECTION_VERSION_MAJOR = 1.68
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)"
# When building, gobject-introspection uses tools/g-ir-scanner to build several
# .gir and .typelib files. g-ir-scanner does not use LDFLAGS, and by default,
# links to the system-installed libglib2 path. To remedy this issue, defining
# LD_LIBRARY_PATH forces g-ir-scanner to use our host installed libglib2 files.
HOST_GOBJECT_INTROSPECTION_NINJA_ENV += \
LD_LIBRARY_PATH="$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(HOST_DIR)/lib"
# Use the host gi-scanner to prevent the scanner from generating incorrect
# elf classes.
GOBJECT_INTROSPECTION_CONF_OPTS = \
-Dgi_cross_use_prebuilt_gi=true \
-Dgi_cross_binary_wrapper="$(STAGING_DIR)/usr/bin/g-ir-scanner-qemuwrapper" \
-Dgi_cross_ldd_wrapper="$(STAGING_DIR)/usr/bin/g-ir-scanner-lddwrapper" \
-Dbuild_introspection_data=true \
-Ddoctool=disabled
ifeq ($(BR2_PACKAGE_CAIRO),y)
GOBJECT_INTROSPECTION_DEPENDENCIES += cairo
GOBJECT_INTROSPECTION_CONF_OPTS += -Dcairo=enabled
else
GOBJECT_INTROSPECTION_CONF_OPTS += -Dcairo=disabled
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_TOOLS_PYTHON_PATH
$(SED) '1s%#!.*%#!$(HOST_DIR)/bin/python3%' $(@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/python3%' $(@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%@QEMU_USERMODE_ARGS@%$(call qstrip,$(BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS))%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)
)
$(SED) "s%@BASENAME_TARGET_CPP@%$(notdir $(TARGET_CPP))%g" \
-e "s%@BASENAME_TARGET_CC@%$(notdir $(TARGET_CC))%g" \
-e "s%@BASENAME_TARGET_CXX@%$(notdir $(TARGET_CXX))%g" \
-e "s%@TARGET_CPPFLAGS@%$(TARGET_CPPFLAGS)%g" \
-e "s%@TARGET_CFLAGS@%$(TARGET_CFLAGS)%g" \
-e "s%@TARGET_CXXFLAGS@%$(TARGET_CXXFLAGS)%g" \
-e "s%@TARGET_LDFLAGS@%$(TARGET_LDFLAGS)%g" \
$(STAGING_DIR)/usr/bin/g-ir-scanner
# Gobject-introspection installs Makefile.introspection in
# $(STAGING_DIR)/usr/share which is needed for autotools-based programs to
# build .gir and .typelib files. Unfortunately, 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 datadir to $(libdir)/../share which will prefix $(STAGING_DIR)
# to the correct location.
$(SED) "s%^datadir=.*%datadir=\$${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 prefix prevents this error.
$(SED) "s%girdir=.*%girdir=\$${prefix}/share/gir-1.0%g" \
$(STAGING_DIR)/usr/lib/pkgconfig/gobject-introspection-1.0.pc
$(SED) "s%typelibdir=.*%typelibdir=\$${prefix}/lib/girepository-1.0%g" \
$(STAGING_DIR)/usr/lib/pkgconfig/gobject-introspection-1.0.pc
# Set includedir to $(STAGING_DIR)/usr/share/gir-1.0 instead of . or
# g-ir-compiler won't find .gir files resulting in a build failure for
# autotools-based based programs
$(SED) "s%includedir=.%includedir=$(STAGING_DIR)/usr/share/gir-1.0%g" \
$(STAGING_DIR)/usr/share/gobject-introspection-1.0/Makefile.introspection
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))