1*c9537f57SPatrick WilliamsSUMMARY = "Middleware layer between GObject-using C libraries and language bindings" 2*c9537f57SPatrick WilliamsDESCRIPTION = "GObject Introspection is a project for providing machine \ 3*c9537f57SPatrick Williamsreadable introspection data of the API of C libraries. This introspection \ 4*c9537f57SPatrick Williamsdata can be used in several different use cases, for example automatic code \ 5*c9537f57SPatrick Williamsgeneration for bindings, API verification and documentation generation." 6*c9537f57SPatrick WilliamsHOMEPAGE = "https://wiki.gnome.org/action/show/Projects/GObjectIntrospection" 7*c9537f57SPatrick WilliamsBUGTRACKER = "https://gitlab.gnome.org/GNOME/gobject-introspection/issues" 8*c9537f57SPatrick WilliamsSECTION = "libs" 9*c9537f57SPatrick WilliamsLICENSE = "LGPL-2.0-or-later & GPL-2.0-or-later & MIT" 10*c9537f57SPatrick WilliamsLIC_FILES_CHKSUM = "file://COPYING;md5=c434e8128a68bedd59b80b2ac1eb1c4a \ 11*c9537f57SPatrick Williams file://tools/compiler.c;endline=20;md5=fc5007fc20022720e6c0b0cdde41fabd \ 12*c9537f57SPatrick Williams file://giscanner/sourcescanner.c;endline=22;md5=194d6e0c1d00662f32d030ce44de8d39 \ 13*c9537f57SPatrick Williams file://girepository/giregisteredtypeinfo.c;endline=21;md5=661847611ae6979465415f31a759ba27 \ 14*c9537f57SPatrick Williams " 15*c9537f57SPatrick Williams 16*c9537f57SPatrick WilliamsSRC_URI = "${GNOME_MIRROR}/${BPN}/${@oe.utils.trim_version("${PV}", 2)}/${BPN}-${PV}.tar.xz \ 17*c9537f57SPatrick Williams " 18*c9537f57SPatrick Williams 19*c9537f57SPatrick WilliamsSRC_URI[sha256sum] = "945b57da7ec262e5c266b89e091d14be800cc424277d82a02872b7d794a84779" 20*c9537f57SPatrick Williams 21*c9537f57SPatrick WilliamsSRC_URI:append:class-native = " file://0001-Relocate-the-repository-directory-for-native-builds.patch" 22*c9537f57SPatrick Williams 23*c9537f57SPatrick Williamsinherit meson pkgconfig gtk-doc python3targetconfig qemu gobject-introspection-data upstream-version-is-even multilib_script 24*c9537f57SPatrick Williams 25*c9537f57SPatrick WilliamsGTKDOC_MESON_OPTION = "gtk_doc" 26*c9537f57SPatrick Williams 27*c9537f57SPatrick WilliamsMULTILIB_SCRIPTS = "${PN}-tools:${bindir}/g-ir-annotation-tool ${PN}-tools:${bindir}/g-ir-scanner" 28*c9537f57SPatrick Williams 29*c9537f57SPatrick Williams# setuptools are required to provide distutils to build the tools 30*c9537f57SPatrick WilliamsDEPENDS += " libffi zlib python3 python3-setuptools flex-native bison-native" 31*c9537f57SPatrick WilliamsDEPENDS:append:class-native = " glib-2.0" 32*c9537f57SPatrick WilliamsDEPENDS:append:class-target = " glib-2.0-initial" 33*c9537f57SPatrick Williams 34*c9537f57SPatrick Williams# target build needs qemu to run temporary introspection binaries created 35*c9537f57SPatrick Williams# on the fly by g-ir-scanner and a native version of itself to run 36*c9537f57SPatrick Williams# native versions of its own tools during build. 37*c9537f57SPatrick WilliamsDEPENDS:append:class-target = " gobject-introspection-native qemu-native" 38*c9537f57SPatrick Williams 39*c9537f57SPatrick Williams# needed for writing out the qemu wrapper script 40*c9537f57SPatrick Williamsexport STAGING_DIR_HOST 41*c9537f57SPatrick Williamsexport B 42*c9537f57SPatrick Williams 43*c9537f57SPatrick WilliamsPACKAGECONFIG ?= "" 44*c9537f57SPatrick WilliamsPACKAGECONFIG[doctool] = "-Ddoctool=enabled,-Ddoctool=disabled,python3-mako," 45*c9537f57SPatrick Williams 46*c9537f57SPatrick Williams# Configure target build to use native tools of itself and to use a qemu wrapper 47*c9537f57SPatrick Williams# and optionally to generate introspection data 48*c9537f57SPatrick WilliamsEXTRA_OEMESON:class-target = " \ 49*c9537f57SPatrick Williams -Dgi_cross_use_prebuilt_gi=true \ 50*c9537f57SPatrick Williams -Dgi_cross_binary_wrapper=${B}/g-ir-scanner-qemuwrapper \ 51*c9537f57SPatrick Williams -Dgi_cross_ldd_wrapper=${B}/g-ir-scanner-lddwrapper \ 52*c9537f57SPatrick Williams -Dgi_cross_pkgconfig_sysroot_path=${PKG_CONFIG_SYSROOT_DIR} \ 53*c9537f57SPatrick Williams ${@bb.utils.contains('GI_DATA_ENABLED', 'True', '-Dbuild_introspection_data=true', '-Dbuild_introspection_data=false', d)} \ 54*c9537f57SPatrick Williams ${@'-Dgir_dir_prefix=${libdir}' if d.getVar('MULTILIBS') else ''} \ 55*c9537f57SPatrick Williams" 56*c9537f57SPatrick Williams 57*c9537f57SPatrick Williamsdo_configure:prepend:class-native() { 58*c9537f57SPatrick Williams # Tweak the native python scripts so that they don't refer to the 59*c9537f57SPatrick Williams # full path of native python binary (the solution is taken from glib-2.0 recipe) 60*c9537f57SPatrick Williams # This removes the risk of exceeding Linux kernel's shebang line limit (128 bytes) 61*c9537f57SPatrick Williams sed -i -e '1s,#!.*,#!${USRBINPATH}/env python3,' ${S}/tools/g-ir-tool-template.in 62*c9537f57SPatrick Williams} 63*c9537f57SPatrick Williams 64*c9537f57SPatrick Williamsdo_configure:prepend:class-target() { 65*c9537f57SPatrick Williams # Write out a qemu wrapper that will be given to gi-scanner so that it 66*c9537f57SPatrick Williams # can run target helper binaries through that. 67*c9537f57SPatrick Williams qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['\\$GIR_EXTRA_LIBS_PATH','.libs','$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" 68*c9537f57SPatrick Williams cat > ${B}/g-ir-scanner-qemuwrapper << EOF 69*c9537f57SPatrick Williams#!/bin/sh 70*c9537f57SPatrick Williams# Use a modules directory which doesn't exist so we don't load random things 71*c9537f57SPatrick Williams# which may then get deleted (or their dependencies) and potentially segfault 72*c9537f57SPatrick Williamsexport GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy 73*c9537f57SPatrick Williams 74*c9537f57SPatrick Williams$qemu_binary "\$@" 75*c9537f57SPatrick Williamsif [ \$? -ne 0 ]; then 76*c9537f57SPatrick Williams echo "If the above error message is about missing .so libraries, then setting up GIR_EXTRA_LIBS_PATH in the recipe should help." 77*c9537f57SPatrick Williams echo "(typically like this: GIR_EXTRA_LIBS_PATH=\"$""{B}/something/.libs\" )" 78*c9537f57SPatrick Williams exit 1 79*c9537f57SPatrick Williamsfi 80*c9537f57SPatrick WilliamsEOF 81*c9537f57SPatrick Williams chmod +x ${B}/g-ir-scanner-qemuwrapper 82*c9537f57SPatrick Williams 83*c9537f57SPatrick Williams # Write out a wrapper for g-ir-scanner itself, which will be used when building introspection files 84*c9537f57SPatrick Williams # for glib-based packages. This wrapper calls the native version of the scanner, and tells it to use 85*c9537f57SPatrick Williams # a qemu wrapper for running transient target binaries produced by the scanner, and an include directory 86*c9537f57SPatrick Williams # from the target sysroot. 87*c9537f57SPatrick Williams cat > ${B}/g-ir-scanner-wrapper << EOF 88*c9537f57SPatrick Williams#!/bin/sh 89*c9537f57SPatrick Williams# This prevents g-ir-scanner from writing cache data to user's HOME dir 90*c9537f57SPatrick Williamsexport GI_SCANNER_DISABLE_CACHE=1 91*c9537f57SPatrick Williams 92*c9537f57SPatrick Williamsg-ir-scanner --lib-dirs-envvar=GIR_EXTRA_LIBS_PATH --use-binary-wrapper=${STAGING_BINDIR}/g-ir-scanner-qemuwrapper --use-ldd-wrapper=${STAGING_BINDIR}/g-ir-scanner-lddwrapper --add-include-path=${STAGING_DATADIR}/gir-1.0 --add-include-path=${STAGING_LIBDIR}/gir-1.0 "\$@" 93*c9537f57SPatrick WilliamsEOF 94*c9537f57SPatrick Williams chmod +x ${B}/g-ir-scanner-wrapper 95*c9537f57SPatrick Williams 96*c9537f57SPatrick Williams # Write out a wrapper for g-ir-compiler, which runs the target version of it through qemu. 97*c9537f57SPatrick Williams # g-ir-compiler writes out the raw content of a C struct to disk, and therefore is architecture dependent. 98*c9537f57SPatrick Williams cat > ${B}/g-ir-compiler-wrapper << EOF 99*c9537f57SPatrick Williams#!/bin/sh 100*c9537f57SPatrick Williams${STAGING_BINDIR}/g-ir-scanner-qemuwrapper ${STAGING_BINDIR}/g-ir-compiler "\$@" 101*c9537f57SPatrick WilliamsEOF 102*c9537f57SPatrick Williams chmod +x ${B}/g-ir-compiler-wrapper 103*c9537f57SPatrick Williams 104*c9537f57SPatrick Williams # Write out a wrapper to use instead of ldd, which does not work when a binary is built 105*c9537f57SPatrick Williams # for a different architecture 106*c9537f57SPatrick Williams cat > ${B}/g-ir-scanner-lddwrapper << EOF 107*c9537f57SPatrick Williams#!/bin/sh 108*c9537f57SPatrick Williams\$OBJDUMP -p "\$@" 109*c9537f57SPatrick WilliamsEOF 110*c9537f57SPatrick Williams chmod +x ${B}/g-ir-scanner-lddwrapper 111*c9537f57SPatrick Williams 112*c9537f57SPatrick Williams # Also tweak the target python scripts so that they don't refer to the 113*c9537f57SPatrick Williams # native version of python binary (the solution is taken from glib-2.0 recipe) 114*c9537f57SPatrick Williams sed -i -e '1s,#!.*,#!${USRBINPATH}/env python3,' ${S}/tools/g-ir-tool-template.in 115*c9537f57SPatrick Williams} 116*c9537f57SPatrick Williams 117*c9537f57SPatrick Williamsdo_compile:prepend() { 118*c9537f57SPatrick Williams # Needed to run g-ir unit tests, which won't be able to find the built libraries otherwise 119*c9537f57SPatrick Williams export GIR_EXTRA_LIBS_PATH=$B/.libs 120*c9537f57SPatrick Williams} 121*c9537f57SPatrick Williams 122*c9537f57SPatrick Williamsdo_install:prepend() { 123*c9537f57SPatrick Williams # This prevents g-ir-scanner from writing cache data to $HOME 124*c9537f57SPatrick Williams export GI_SCANNER_DISABLE_CACHE=1 125*c9537f57SPatrick Williams} 126*c9537f57SPatrick Williams 127*c9537f57SPatrick Williams# Our wrappers need to be available system-wide, because they will be used 128*c9537f57SPatrick Williams# to build introspection files for all other gobject-based packages 129*c9537f57SPatrick Williamsdo_install:append:class-target() { 130*c9537f57SPatrick Williams install -d ${D}${bindir}/ 131*c9537f57SPatrick Williams install ${B}/g-ir-scanner-qemuwrapper ${D}${bindir}/ 132*c9537f57SPatrick Williams install ${B}/g-ir-scanner-wrapper ${D}${bindir}/ 133*c9537f57SPatrick Williams install ${B}/g-ir-compiler-wrapper ${D}${bindir}/ 134*c9537f57SPatrick Williams install ${B}/g-ir-scanner-lddwrapper ${D}${bindir}/ 135*c9537f57SPatrick Williams} 136*c9537f57SPatrick Williams 137*c9537f57SPatrick Williams# we need target versions of introspection tools in sysroot so that they can be run via qemu 138*c9537f57SPatrick Williams# when building introspection files in other packages 139*c9537f57SPatrick WilliamsSYSROOT_DIRS:append:class-target = " ${bindir}" 140*c9537f57SPatrick Williams 141*c9537f57SPatrick WilliamsSYSROOT_PREPROCESS_FUNCS:append:class-target = " gi_binaries_sysroot_preprocess" 142*c9537f57SPatrick Williamsgi_binaries_sysroot_preprocess() { 143*c9537f57SPatrick Williams # Tweak the binary names in the introspection pkgconfig file, so that it 144*c9537f57SPatrick Williams # picks up our wrappers which do the cross-compile and qemu magic. 145*c9537f57SPatrick Williams sed -i \ 146*c9537f57SPatrick Williams -e "s|g_ir_scanner=.*|g_ir_scanner=${bindir}/g-ir-scanner-wrapper|" \ 147*c9537f57SPatrick Williams -e "s|g_ir_compiler=.*|g_ir_compiler=${bindir}/g-ir-compiler-wrapper|" \ 148*c9537f57SPatrick Williams ${SYSROOT_DESTDIR}${libdir}/pkgconfig/gobject-introspection-1.0.pc 149*c9537f57SPatrick Williams} 150*c9537f57SPatrick Williams 151*c9537f57SPatrick WilliamsSYSROOT_PREPROCESS_FUNCS:append = " gi_ldsoconf_sysroot_preprocess" 152*c9537f57SPatrick Williamsgi_ldsoconf_sysroot_preprocess () { 153*c9537f57SPatrick Williams mkdir -p ${SYSROOT_DESTDIR}${bindir} 154*c9537f57SPatrick Williams dest=${SYSROOT_DESTDIR}${bindir}/postinst-ldsoconf-${PN} 155*c9537f57SPatrick Williams echo "#!/bin/sh" > $dest 156*c9537f57SPatrick Williams echo "mkdir -p ${STAGING_DIR_TARGET}${sysconfdir}" >> $dest 157*c9537f57SPatrick Williams echo "echo ${base_libdir} >> ${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf" >> $dest 158*c9537f57SPatrick Williams echo "echo ${libdir} >> ${STAGING_DIR_TARGET}${sysconfdir}/ld.so.conf" >> $dest 159*c9537f57SPatrick Williams chmod 755 $dest 160*c9537f57SPatrick Williams} 161*c9537f57SPatrick Williams 162*c9537f57SPatrick Williams# Remove wrapper files from the package, only used for cross-compiling 163*c9537f57SPatrick WilliamsPACKAGE_PREPROCESS_FUNCS += "gi_package_preprocess" 164*c9537f57SPatrick Williamsgi_package_preprocess() { 165*c9537f57SPatrick Williams rm -f ${PKGD}${bindir}/g-ir-scanner-qemuwrapper 166*c9537f57SPatrick Williams rm -f ${PKGD}${bindir}/g-ir-scanner-wrapper 167*c9537f57SPatrick Williams rm -f ${PKGD}${bindir}/g-ir-compiler-wrapper 168*c9537f57SPatrick Williams rm -f ${PKGD}${bindir}/g-ir-scanner-lddwrapper 169*c9537f57SPatrick Williams} 170*c9537f57SPatrick Williams 171*c9537f57SPatrick WilliamsSSTATE_SCAN_FILES += "g-ir-scanner-qemuwrapper g-ir-scanner-wrapper g-ir-compiler-wrapper g-ir-scanner-lddwrapper Gio-2.0.gir postinst-ldsoconf-${PN}" 172*c9537f57SPatrick Williams 173*c9537f57SPatrick WilliamsPACKAGES =+ "\ 174*c9537f57SPatrick Williams ${PN}-tools \ 175*c9537f57SPatrick Williams" 176*c9537f57SPatrick Williams 177*c9537f57SPatrick WilliamsFILES:${PN}-tools = "\ 178*c9537f57SPatrick Williams ${bindir} \ 179*c9537f57SPatrick Williams ${libdir}/gobject-introspection/giscanner \ 180*c9537f57SPatrick Williams" 181*c9537f57SPatrick Williams 182*c9537f57SPatrick Williams# .typelib files are needed at runtime and so they go to the main package 183*c9537f57SPatrick WilliamsFILES:${PN}:append = " ${libdir}/girepository-*/*.typelib" 184*c9537f57SPatrick Williams 185*c9537f57SPatrick Williams# .gir files go to dev package, as they're needed for developing (but not for running) 186*c9537f57SPatrick Williams# things that depends on introspection. 187*c9537f57SPatrick WilliamsFILES:${PN}-dev:append = " ${datadir}/gir-*/*.gir ${libdir}/gir-*/*.gir" 188*c9537f57SPatrick WilliamsFILES:${PN}-dev:append = " ${datadir}/gir-*/*.rnc" 189*c9537f57SPatrick Williams 190*c9537f57SPatrick Williams# These are used by gobject-based packages 191*c9537f57SPatrick Williams# to generate transient introspection binaries 192*c9537f57SPatrick WilliamsFILES:${PN}-dev:append = " ${datadir}/gobject-introspection-1.0/gdump.c \ 193*c9537f57SPatrick Williams ${datadir}/gobject-introspection-1.0/Makefile.introspection" 194*c9537f57SPatrick Williams 195*c9537f57SPatrick Williams# These are used by dependent packages (e.g. pygobject) to build their 196*c9537f57SPatrick Williams# testsuites. 197*c9537f57SPatrick WilliamsFILES:${PN}-dev:append = " ${datadir}/gobject-introspection-1.0/tests/*.c \ 198*c9537f57SPatrick Williams ${datadir}/gobject-introspection-1.0/tests/*.h" 199*c9537f57SPatrick Williams 200*c9537f57SPatrick WilliamsFILES:${PN}-dbg += "${libdir}/gobject-introspection/giscanner/.debug/" 201*c9537f57SPatrick WilliamsFILES:${PN}-staticdev += "${libdir}/gobject-introspection/giscanner/*.a" 202*c9537f57SPatrick Williams 203*c9537f57SPatrick Williams# glib-2.0 is required for libgirepository 204*c9537f57SPatrick WilliamsRDEPENDS:${PN} = "glib-2.0" 205*c9537f57SPatrick Williams 206*c9537f57SPatrick Williams# setuptools can be removed when upstream removes all uses of distutils 207*c9537f57SPatrick WilliamsRDEPENDS:${PN}-tools = "\ 208*c9537f57SPatrick Williams glib-2.0 \ 209*c9537f57SPatrick Williams python3-pickle \ 210*c9537f57SPatrick Williams python3-setuptools \ 211*c9537f57SPatrick Williams python3-xml \ 212*c9537f57SPatrick Williams" 213*c9537f57SPatrick Williams 214*c9537f57SPatrick WilliamsBBCLASSEXTEND = "native" 215