Message ID | 20230324031319.4172410-1-zboszor@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2] meson.bbclass: Split into meson-env and meson classes | expand |
It would help if you explain why existing meson class can't be used directly, and what the meson class adds compared to meson-env that gets in the way of that. Alex On Fri, 24 Mar 2023 at 04:13, Zoltan Boszormenyi <zboszor@gmail.com> wrote: > > The new meson-env class will be used by a new PEP517 python > build class using meson-python a.k.a. mesonpy. > > Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> > --- > v2: The split-off part is called meson-env.bbclass > because "common" is not liked. > > meta/classes-recipe/meson-env.bbclass | 141 ++++++++++++++++++++++++++ > meta/classes-recipe/meson.bbclass | 136 +------------------------ > 2 files changed, 142 insertions(+), 135 deletions(-) > create mode 100644 meta/classes-recipe/meson-env.bbclass > > diff --git a/meta/classes-recipe/meson-env.bbclass b/meta/classes-recipe/meson-env.bbclass > new file mode 100644 > index 0000000000..e02b3e5ab6 > --- /dev/null > +++ b/meta/classes-recipe/meson-env.bbclass > @@ -0,0 +1,141 @@ > +# > +# Copyright OpenEmbedded Contributors > +# > +# SPDX-License-Identifier: MIT > +# > + > +inherit python3native meson-routines qemu > + > +DEPENDS:append = " meson-native ninja-native" > + > +EXEWRAPPER_ENABLED:class-native = "False" > +EXEWRAPPER_ENABLED:class-nativesdk = "False" > +EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" > +DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" > + > +# As Meson enforces out-of-tree builds we can just use cleandirs > +B = "${WORKDIR}/build" > +do_configure[cleandirs] = "${B}" > + > +# Where the meson.build build configuration is > +MESON_SOURCEPATH = "${S}" > + > +def noprefix(var, d): > + return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) > + > +MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" > +MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" > +MESONOPTS = " --prefix ${prefix} \ > + --buildtype ${MESON_BUILDTYPE} \ > + --bindir ${@noprefix('bindir', d)} \ > + --sbindir ${@noprefix('sbindir', d)} \ > + --datadir ${@noprefix('datadir', d)} \ > + --libdir ${@noprefix('libdir', d)} \ > + --libexecdir ${@noprefix('libexecdir', d)} \ > + --includedir ${@noprefix('includedir', d)} \ > + --mandir ${@noprefix('mandir', d)} \ > + --infodir ${@noprefix('infodir', d)} \ > + --sysconfdir ${sysconfdir} \ > + --localstatedir ${localstatedir} \ > + --sharedstatedir ${sharedstatedir} \ > + --wrap-mode nodownload \ > + --native-file ${WORKDIR}/meson.native" > + > +EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" > + > +MESON_CROSS_FILE = "" > +MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" > +MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" > + > +# Needed to set up qemu wrapper below > +export STAGING_DIR_HOST > + > +def rust_tool(d, target_var): > + rustc = d.getVar('RUSTC') > + if not rustc: > + return "" > + cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() > + return "rust = %s" % repr(cmd) > + > +addtask write_config before do_configure > +do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" > +do_write_config() { > + # This needs to be Py to split the args into single-element lists > + cat >${WORKDIR}/meson.cross <<EOF > +[binaries] > +c = ${@meson_array('CC', d)} > +cpp = ${@meson_array('CXX', d)} > +cython = 'cython3' > +ar = ${@meson_array('AR', d)} > +nm = ${@meson_array('NM', d)} > +strip = ${@meson_array('STRIP', d)} > +readelf = ${@meson_array('READELF', d)} > +objcopy = ${@meson_array('OBJCOPY', d)} > +pkgconfig = 'pkg-config' > +llvm-config = 'llvm-config' > +cups-config = 'cups-config' > +g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' > +g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' > +${@rust_tool(d, "HOST_SYS")} > +${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} > + > +[built-in options] > +c_args = ${@meson_array('CFLAGS', d)} > +c_link_args = ${@meson_array('LDFLAGS', d)} > +cpp_args = ${@meson_array('CXXFLAGS', d)} > +cpp_link_args = ${@meson_array('LDFLAGS', d)} > + > +[properties] > +needs_exe_wrapper = true > + > +[host_machine] > +system = '${@meson_operating_system('HOST_OS', d)}' > +cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' > +cpu = '${HOST_ARCH}' > +endian = '${@meson_endian('HOST', d)}' > + > +[target_machine] > +system = '${@meson_operating_system('TARGET_OS', d)}' > +cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' > +cpu = '${TARGET_ARCH}' > +endian = '${@meson_endian('TARGET', d)}' > +EOF > + > + cat >${WORKDIR}/meson.native <<EOF > +[binaries] > +c = ${@meson_array('BUILD_CC', d)} > +cpp = ${@meson_array('BUILD_CXX', d)} > +cython = 'cython3' > +ar = ${@meson_array('BUILD_AR', d)} > +nm = ${@meson_array('BUILD_NM', d)} > +strip = ${@meson_array('BUILD_STRIP', d)} > +readelf = ${@meson_array('BUILD_READELF', d)} > +objcopy = ${@meson_array('BUILD_OBJCOPY', d)} > +pkgconfig = 'pkg-config-native' > +${@rust_tool(d, "BUILD_SYS")} > + > +[built-in options] > +c_args = ${@meson_array('BUILD_CFLAGS', d)} > +c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > +cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} > +cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > +EOF > +} > + > +do_write_config:append:class-target() { > + # Write out a qemu wrapper that will be used as exe_wrapper so that meson > + # can run target helper binaries through that. > + qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" > + cat > ${WORKDIR}/meson-qemuwrapper << EOF > +#!/bin/sh > +# Use a modules directory which doesn't exist so we don't load random things > +# which may then get deleted (or their dependencies) and potentially segfault > +export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy > + > +# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly > +unset LD_LIBRARY_PATH > + > +$qemu_binary "\$@" > +EOF > + chmod +x ${WORKDIR}/meson-qemuwrapper > +} > diff --git a/meta/classes-recipe/meson.bbclass b/meta/classes-recipe/meson.bbclass > index 48688bed75..697cf6ecc8 100644 > --- a/meta/classes-recipe/meson.bbclass > +++ b/meta/classes-recipe/meson.bbclass > @@ -4,141 +4,7 @@ > # SPDX-License-Identifier: MIT > # > > -inherit python3native meson-routines qemu > - > -DEPENDS:append = " meson-native ninja-native" > - > -EXEWRAPPER_ENABLED:class-native = "False" > -EXEWRAPPER_ENABLED:class-nativesdk = "False" > -EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" > -DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" > - > -# As Meson enforces out-of-tree builds we can just use cleandirs > -B = "${WORKDIR}/build" > -do_configure[cleandirs] = "${B}" > - > -# Where the meson.build build configuration is > -MESON_SOURCEPATH = "${S}" > - > -def noprefix(var, d): > - return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) > - > -MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" > -MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" > -MESONOPTS = " --prefix ${prefix} \ > - --buildtype ${MESON_BUILDTYPE} \ > - --bindir ${@noprefix('bindir', d)} \ > - --sbindir ${@noprefix('sbindir', d)} \ > - --datadir ${@noprefix('datadir', d)} \ > - --libdir ${@noprefix('libdir', d)} \ > - --libexecdir ${@noprefix('libexecdir', d)} \ > - --includedir ${@noprefix('includedir', d)} \ > - --mandir ${@noprefix('mandir', d)} \ > - --infodir ${@noprefix('infodir', d)} \ > - --sysconfdir ${sysconfdir} \ > - --localstatedir ${localstatedir} \ > - --sharedstatedir ${sharedstatedir} \ > - --wrap-mode nodownload \ > - --native-file ${WORKDIR}/meson.native" > - > -EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" > - > -MESON_CROSS_FILE = "" > -MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" > -MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" > - > -# Needed to set up qemu wrapper below > -export STAGING_DIR_HOST > - > -def rust_tool(d, target_var): > - rustc = d.getVar('RUSTC') > - if not rustc: > - return "" > - cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() > - return "rust = %s" % repr(cmd) > - > -addtask write_config before do_configure > -do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" > -do_write_config() { > - # This needs to be Py to split the args into single-element lists > - cat >${WORKDIR}/meson.cross <<EOF > -[binaries] > -c = ${@meson_array('CC', d)} > -cpp = ${@meson_array('CXX', d)} > -cython = 'cython3' > -ar = ${@meson_array('AR', d)} > -nm = ${@meson_array('NM', d)} > -strip = ${@meson_array('STRIP', d)} > -readelf = ${@meson_array('READELF', d)} > -objcopy = ${@meson_array('OBJCOPY', d)} > -pkgconfig = 'pkg-config' > -llvm-config = 'llvm-config' > -cups-config = 'cups-config' > -g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' > -g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' > -${@rust_tool(d, "HOST_SYS")} > -${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} > - > -[built-in options] > -c_args = ${@meson_array('CFLAGS', d)} > -c_link_args = ${@meson_array('LDFLAGS', d)} > -cpp_args = ${@meson_array('CXXFLAGS', d)} > -cpp_link_args = ${@meson_array('LDFLAGS', d)} > - > -[properties] > -needs_exe_wrapper = true > - > -[host_machine] > -system = '${@meson_operating_system('HOST_OS', d)}' > -cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' > -cpu = '${HOST_ARCH}' > -endian = '${@meson_endian('HOST', d)}' > - > -[target_machine] > -system = '${@meson_operating_system('TARGET_OS', d)}' > -cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' > -cpu = '${TARGET_ARCH}' > -endian = '${@meson_endian('TARGET', d)}' > -EOF > - > - cat >${WORKDIR}/meson.native <<EOF > -[binaries] > -c = ${@meson_array('BUILD_CC', d)} > -cpp = ${@meson_array('BUILD_CXX', d)} > -cython = 'cython3' > -ar = ${@meson_array('BUILD_AR', d)} > -nm = ${@meson_array('BUILD_NM', d)} > -strip = ${@meson_array('BUILD_STRIP', d)} > -readelf = ${@meson_array('BUILD_READELF', d)} > -objcopy = ${@meson_array('BUILD_OBJCOPY', d)} > -pkgconfig = 'pkg-config-native' > -${@rust_tool(d, "BUILD_SYS")} > - > -[built-in options] > -c_args = ${@meson_array('BUILD_CFLAGS', d)} > -c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > -cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} > -cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > -EOF > -} > - > -do_write_config:append:class-target() { > - # Write out a qemu wrapper that will be used as exe_wrapper so that meson > - # can run target helper binaries through that. > - qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" > - cat > ${WORKDIR}/meson-qemuwrapper << EOF > -#!/bin/sh > -# Use a modules directory which doesn't exist so we don't load random things > -# which may then get deleted (or their dependencies) and potentially segfault > -export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy > - > -# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly > -unset LD_LIBRARY_PATH > - > -$qemu_binary "\$@" > -EOF > - chmod +x ${WORKDIR}/meson-qemuwrapper > -} > +inherit meson-env > > # Tell externalsrc that changes to this file require a reconfigure > CONFIGURE_FILES = "meson.build" > -- > 2.39.2 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#179011): https://lists.openembedded.org/g/openembedded-core/message/179011 > Mute This Topic: https://lists.openembedded.org/mt/97816812/1686489 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
2023. 03. 24. 8:47 keltezéssel, Alexander Kanavin írta: > It would help if you explain why existing meson class can't be used > directly, and what the meson class adds compared to meson-env that > gets in the way of that. The email thread for the mesonpy bbclass in openembedded-devel lists all the problems. Summary: * Both meson and python_pep517 classes declare EXPORT_FUNCTION. For some reason, meson always wins regardless of the inheritance order. The mesonpy class needs the meson cross compiler environment using the pep517 configure/compile/install functions. * The meson class adds do_qa_configure which fails because the mesonpy build moves the meson setup phase from do_configure to do_compile. Removing items from do_configure[postfuncs] is impossible because this results in a parse error: do_configure[postfuncs]:remove = "meson_do_qa_configure" The only option left is to split the environment setup part out of meson.bbclass. > Alex > > On Fri, 24 Mar 2023 at 04:13, Zoltan Boszormenyi <zboszor@gmail.com> wrote: >> The new meson-env class will be used by a new PEP517 python >> build class using meson-python a.k.a. mesonpy. >> >> Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> >> --- >> v2: The split-off part is called meson-env.bbclass >> because "common" is not liked. >> >> meta/classes-recipe/meson-env.bbclass | 141 ++++++++++++++++++++++++++ >> meta/classes-recipe/meson.bbclass | 136 +------------------------ >> 2 files changed, 142 insertions(+), 135 deletions(-) >> create mode 100644 meta/classes-recipe/meson-env.bbclass >> >> diff --git a/meta/classes-recipe/meson-env.bbclass b/meta/classes-recipe/meson-env.bbclass >> new file mode 100644 >> index 0000000000..e02b3e5ab6 >> --- /dev/null >> +++ b/meta/classes-recipe/meson-env.bbclass >> @@ -0,0 +1,141 @@ >> +# >> +# Copyright OpenEmbedded Contributors >> +# >> +# SPDX-License-Identifier: MIT >> +# >> + >> +inherit python3native meson-routines qemu >> + >> +DEPENDS:append = " meson-native ninja-native" >> + >> +EXEWRAPPER_ENABLED:class-native = "False" >> +EXEWRAPPER_ENABLED:class-nativesdk = "False" >> +EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" >> +DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" >> + >> +# As Meson enforces out-of-tree builds we can just use cleandirs >> +B = "${WORKDIR}/build" >> +do_configure[cleandirs] = "${B}" >> + >> +# Where the meson.build build configuration is >> +MESON_SOURCEPATH = "${S}" >> + >> +def noprefix(var, d): >> + return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) >> + >> +MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" >> +MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" >> +MESONOPTS = " --prefix ${prefix} \ >> + --buildtype ${MESON_BUILDTYPE} \ >> + --bindir ${@noprefix('bindir', d)} \ >> + --sbindir ${@noprefix('sbindir', d)} \ >> + --datadir ${@noprefix('datadir', d)} \ >> + --libdir ${@noprefix('libdir', d)} \ >> + --libexecdir ${@noprefix('libexecdir', d)} \ >> + --includedir ${@noprefix('includedir', d)} \ >> + --mandir ${@noprefix('mandir', d)} \ >> + --infodir ${@noprefix('infodir', d)} \ >> + --sysconfdir ${sysconfdir} \ >> + --localstatedir ${localstatedir} \ >> + --sharedstatedir ${sharedstatedir} \ >> + --wrap-mode nodownload \ >> + --native-file ${WORKDIR}/meson.native" >> + >> +EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" >> + >> +MESON_CROSS_FILE = "" >> +MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" >> +MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" >> + >> +# Needed to set up qemu wrapper below >> +export STAGING_DIR_HOST >> + >> +def rust_tool(d, target_var): >> + rustc = d.getVar('RUSTC') >> + if not rustc: >> + return "" >> + cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() >> + return "rust = %s" % repr(cmd) >> + >> +addtask write_config before do_configure >> +do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" >> +do_write_config() { >> + # This needs to be Py to split the args into single-element lists >> + cat >${WORKDIR}/meson.cross <<EOF >> +[binaries] >> +c = ${@meson_array('CC', d)} >> +cpp = ${@meson_array('CXX', d)} >> +cython = 'cython3' >> +ar = ${@meson_array('AR', d)} >> +nm = ${@meson_array('NM', d)} >> +strip = ${@meson_array('STRIP', d)} >> +readelf = ${@meson_array('READELF', d)} >> +objcopy = ${@meson_array('OBJCOPY', d)} >> +pkgconfig = 'pkg-config' >> +llvm-config = 'llvm-config' >> +cups-config = 'cups-config' >> +g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' >> +g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' >> +${@rust_tool(d, "HOST_SYS")} >> +${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} >> + >> +[built-in options] >> +c_args = ${@meson_array('CFLAGS', d)} >> +c_link_args = ${@meson_array('LDFLAGS', d)} >> +cpp_args = ${@meson_array('CXXFLAGS', d)} >> +cpp_link_args = ${@meson_array('LDFLAGS', d)} >> + >> +[properties] >> +needs_exe_wrapper = true >> + >> +[host_machine] >> +system = '${@meson_operating_system('HOST_OS', d)}' >> +cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' >> +cpu = '${HOST_ARCH}' >> +endian = '${@meson_endian('HOST', d)}' >> + >> +[target_machine] >> +system = '${@meson_operating_system('TARGET_OS', d)}' >> +cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' >> +cpu = '${TARGET_ARCH}' >> +endian = '${@meson_endian('TARGET', d)}' >> +EOF >> + >> + cat >${WORKDIR}/meson.native <<EOF >> +[binaries] >> +c = ${@meson_array('BUILD_CC', d)} >> +cpp = ${@meson_array('BUILD_CXX', d)} >> +cython = 'cython3' >> +ar = ${@meson_array('BUILD_AR', d)} >> +nm = ${@meson_array('BUILD_NM', d)} >> +strip = ${@meson_array('BUILD_STRIP', d)} >> +readelf = ${@meson_array('BUILD_READELF', d)} >> +objcopy = ${@meson_array('BUILD_OBJCOPY', d)} >> +pkgconfig = 'pkg-config-native' >> +${@rust_tool(d, "BUILD_SYS")} >> + >> +[built-in options] >> +c_args = ${@meson_array('BUILD_CFLAGS', d)} >> +c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >> +cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} >> +cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >> +EOF >> +} >> + >> +do_write_config:append:class-target() { >> + # Write out a qemu wrapper that will be used as exe_wrapper so that meson >> + # can run target helper binaries through that. >> + qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" >> + cat > ${WORKDIR}/meson-qemuwrapper << EOF >> +#!/bin/sh >> +# Use a modules directory which doesn't exist so we don't load random things >> +# which may then get deleted (or their dependencies) and potentially segfault >> +export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy >> + >> +# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly >> +unset LD_LIBRARY_PATH >> + >> +$qemu_binary "\$@" >> +EOF >> + chmod +x ${WORKDIR}/meson-qemuwrapper >> +} >> diff --git a/meta/classes-recipe/meson.bbclass b/meta/classes-recipe/meson.bbclass >> index 48688bed75..697cf6ecc8 100644 >> --- a/meta/classes-recipe/meson.bbclass >> +++ b/meta/classes-recipe/meson.bbclass >> @@ -4,141 +4,7 @@ >> # SPDX-License-Identifier: MIT >> # >> >> -inherit python3native meson-routines qemu >> - >> -DEPENDS:append = " meson-native ninja-native" >> - >> -EXEWRAPPER_ENABLED:class-native = "False" >> -EXEWRAPPER_ENABLED:class-nativesdk = "False" >> -EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" >> -DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" >> - >> -# As Meson enforces out-of-tree builds we can just use cleandirs >> -B = "${WORKDIR}/build" >> -do_configure[cleandirs] = "${B}" >> - >> -# Where the meson.build build configuration is >> -MESON_SOURCEPATH = "${S}" >> - >> -def noprefix(var, d): >> - return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) >> - >> -MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" >> -MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" >> -MESONOPTS = " --prefix ${prefix} \ >> - --buildtype ${MESON_BUILDTYPE} \ >> - --bindir ${@noprefix('bindir', d)} \ >> - --sbindir ${@noprefix('sbindir', d)} \ >> - --datadir ${@noprefix('datadir', d)} \ >> - --libdir ${@noprefix('libdir', d)} \ >> - --libexecdir ${@noprefix('libexecdir', d)} \ >> - --includedir ${@noprefix('includedir', d)} \ >> - --mandir ${@noprefix('mandir', d)} \ >> - --infodir ${@noprefix('infodir', d)} \ >> - --sysconfdir ${sysconfdir} \ >> - --localstatedir ${localstatedir} \ >> - --sharedstatedir ${sharedstatedir} \ >> - --wrap-mode nodownload \ >> - --native-file ${WORKDIR}/meson.native" >> - >> -EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" >> - >> -MESON_CROSS_FILE = "" >> -MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" >> -MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" >> - >> -# Needed to set up qemu wrapper below >> -export STAGING_DIR_HOST >> - >> -def rust_tool(d, target_var): >> - rustc = d.getVar('RUSTC') >> - if not rustc: >> - return "" >> - cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() >> - return "rust = %s" % repr(cmd) >> - >> -addtask write_config before do_configure >> -do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" >> -do_write_config() { >> - # This needs to be Py to split the args into single-element lists >> - cat >${WORKDIR}/meson.cross <<EOF >> -[binaries] >> -c = ${@meson_array('CC', d)} >> -cpp = ${@meson_array('CXX', d)} >> -cython = 'cython3' >> -ar = ${@meson_array('AR', d)} >> -nm = ${@meson_array('NM', d)} >> -strip = ${@meson_array('STRIP', d)} >> -readelf = ${@meson_array('READELF', d)} >> -objcopy = ${@meson_array('OBJCOPY', d)} >> -pkgconfig = 'pkg-config' >> -llvm-config = 'llvm-config' >> -cups-config = 'cups-config' >> -g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' >> -g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' >> -${@rust_tool(d, "HOST_SYS")} >> -${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} >> - >> -[built-in options] >> -c_args = ${@meson_array('CFLAGS', d)} >> -c_link_args = ${@meson_array('LDFLAGS', d)} >> -cpp_args = ${@meson_array('CXXFLAGS', d)} >> -cpp_link_args = ${@meson_array('LDFLAGS', d)} >> - >> -[properties] >> -needs_exe_wrapper = true >> - >> -[host_machine] >> -system = '${@meson_operating_system('HOST_OS', d)}' >> -cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' >> -cpu = '${HOST_ARCH}' >> -endian = '${@meson_endian('HOST', d)}' >> - >> -[target_machine] >> -system = '${@meson_operating_system('TARGET_OS', d)}' >> -cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' >> -cpu = '${TARGET_ARCH}' >> -endian = '${@meson_endian('TARGET', d)}' >> -EOF >> - >> - cat >${WORKDIR}/meson.native <<EOF >> -[binaries] >> -c = ${@meson_array('BUILD_CC', d)} >> -cpp = ${@meson_array('BUILD_CXX', d)} >> -cython = 'cython3' >> -ar = ${@meson_array('BUILD_AR', d)} >> -nm = ${@meson_array('BUILD_NM', d)} >> -strip = ${@meson_array('BUILD_STRIP', d)} >> -readelf = ${@meson_array('BUILD_READELF', d)} >> -objcopy = ${@meson_array('BUILD_OBJCOPY', d)} >> -pkgconfig = 'pkg-config-native' >> -${@rust_tool(d, "BUILD_SYS")} >> - >> -[built-in options] >> -c_args = ${@meson_array('BUILD_CFLAGS', d)} >> -c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >> -cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} >> -cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >> -EOF >> -} >> - >> -do_write_config:append:class-target() { >> - # Write out a qemu wrapper that will be used as exe_wrapper so that meson >> - # can run target helper binaries through that. >> - qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" >> - cat > ${WORKDIR}/meson-qemuwrapper << EOF >> -#!/bin/sh >> -# Use a modules directory which doesn't exist so we don't load random things >> -# which may then get deleted (or their dependencies) and potentially segfault >> -export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy >> - >> -# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly >> -unset LD_LIBRARY_PATH >> - >> -$qemu_binary "\$@" >> -EOF >> - chmod +x ${WORKDIR}/meson-qemuwrapper >> -} >> +inherit meson-env >> >> # Tell externalsrc that changes to this file require a reconfigure >> CONFIGURE_FILES = "meson.build" >> -- >> 2.39.2 >> >> >> -=-=-=-=-=-=-=-=-=-=-=- >> Links: You receive all messages sent to this group. >> View/Reply Online (#179011): https://lists.openembedded.org/g/openembedded-core/message/179011 >> Mute This Topic: https://lists.openembedded.org/mt/97816812/1686489 >> Group Owner: openembedded-core+owner@lists.openembedded.org >> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com] >> -=-=-=-=-=-=-=-=-=-=-=- >>
Cam you please place this information into the commit message? At some point someone will need to find out why this was done this way, and email thread would by then be hopelessly undiscoverable. Alex On Fri, 24 Mar 2023 at 09:43, Böszörményi Zoltán <zboszor@gmail.com> wrote: > > 2023. 03. 24. 8:47 keltezéssel, Alexander Kanavin írta: > > It would help if you explain why existing meson class can't be used > > directly, and what the meson class adds compared to meson-env that > > gets in the way of that. > > The email thread for the mesonpy bbclass in > openembedded-devel lists all the problems. > > Summary: > * Both meson and python_pep517 classes declare > EXPORT_FUNCTION. For some reason, meson always wins > regardless of the inheritance order. The mesonpy class > needs the meson cross compiler environment using the > pep517 configure/compile/install functions. > * The meson class adds do_qa_configure which fails because > the mesonpy build moves the meson setup phase from > do_configure to do_compile. Removing items from > do_configure[postfuncs] is impossible because this results > in a parse error: > do_configure[postfuncs]:remove = "meson_do_qa_configure" > > The only option left is to split the environment setup part > out of meson.bbclass. > > > Alex > > > > On Fri, 24 Mar 2023 at 04:13, Zoltan Boszormenyi <zboszor@gmail.com> wrote: > >> The new meson-env class will be used by a new PEP517 python > >> build class using meson-python a.k.a. mesonpy. > >> > >> Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> > >> --- > >> v2: The split-off part is called meson-env.bbclass > >> because "common" is not liked. > >> > >> meta/classes-recipe/meson-env.bbclass | 141 ++++++++++++++++++++++++++ > >> meta/classes-recipe/meson.bbclass | 136 +------------------------ > >> 2 files changed, 142 insertions(+), 135 deletions(-) > >> create mode 100644 meta/classes-recipe/meson-env.bbclass > >> > >> diff --git a/meta/classes-recipe/meson-env.bbclass b/meta/classes-recipe/meson-env.bbclass > >> new file mode 100644 > >> index 0000000000..e02b3e5ab6 > >> --- /dev/null > >> +++ b/meta/classes-recipe/meson-env.bbclass > >> @@ -0,0 +1,141 @@ > >> +# > >> +# Copyright OpenEmbedded Contributors > >> +# > >> +# SPDX-License-Identifier: MIT > >> +# > >> + > >> +inherit python3native meson-routines qemu > >> + > >> +DEPENDS:append = " meson-native ninja-native" > >> + > >> +EXEWRAPPER_ENABLED:class-native = "False" > >> +EXEWRAPPER_ENABLED:class-nativesdk = "False" > >> +EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" > >> +DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" > >> + > >> +# As Meson enforces out-of-tree builds we can just use cleandirs > >> +B = "${WORKDIR}/build" > >> +do_configure[cleandirs] = "${B}" > >> + > >> +# Where the meson.build build configuration is > >> +MESON_SOURCEPATH = "${S}" > >> + > >> +def noprefix(var, d): > >> + return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) > >> + > >> +MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" > >> +MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" > >> +MESONOPTS = " --prefix ${prefix} \ > >> + --buildtype ${MESON_BUILDTYPE} \ > >> + --bindir ${@noprefix('bindir', d)} \ > >> + --sbindir ${@noprefix('sbindir', d)} \ > >> + --datadir ${@noprefix('datadir', d)} \ > >> + --libdir ${@noprefix('libdir', d)} \ > >> + --libexecdir ${@noprefix('libexecdir', d)} \ > >> + --includedir ${@noprefix('includedir', d)} \ > >> + --mandir ${@noprefix('mandir', d)} \ > >> + --infodir ${@noprefix('infodir', d)} \ > >> + --sysconfdir ${sysconfdir} \ > >> + --localstatedir ${localstatedir} \ > >> + --sharedstatedir ${sharedstatedir} \ > >> + --wrap-mode nodownload \ > >> + --native-file ${WORKDIR}/meson.native" > >> + > >> +EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" > >> + > >> +MESON_CROSS_FILE = "" > >> +MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" > >> +MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" > >> + > >> +# Needed to set up qemu wrapper below > >> +export STAGING_DIR_HOST > >> + > >> +def rust_tool(d, target_var): > >> + rustc = d.getVar('RUSTC') > >> + if not rustc: > >> + return "" > >> + cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() > >> + return "rust = %s" % repr(cmd) > >> + > >> +addtask write_config before do_configure > >> +do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" > >> +do_write_config() { > >> + # This needs to be Py to split the args into single-element lists > >> + cat >${WORKDIR}/meson.cross <<EOF > >> +[binaries] > >> +c = ${@meson_array('CC', d)} > >> +cpp = ${@meson_array('CXX', d)} > >> +cython = 'cython3' > >> +ar = ${@meson_array('AR', d)} > >> +nm = ${@meson_array('NM', d)} > >> +strip = ${@meson_array('STRIP', d)} > >> +readelf = ${@meson_array('READELF', d)} > >> +objcopy = ${@meson_array('OBJCOPY', d)} > >> +pkgconfig = 'pkg-config' > >> +llvm-config = 'llvm-config' > >> +cups-config = 'cups-config' > >> +g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' > >> +g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' > >> +${@rust_tool(d, "HOST_SYS")} > >> +${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} > >> + > >> +[built-in options] > >> +c_args = ${@meson_array('CFLAGS', d)} > >> +c_link_args = ${@meson_array('LDFLAGS', d)} > >> +cpp_args = ${@meson_array('CXXFLAGS', d)} > >> +cpp_link_args = ${@meson_array('LDFLAGS', d)} > >> + > >> +[properties] > >> +needs_exe_wrapper = true > >> + > >> +[host_machine] > >> +system = '${@meson_operating_system('HOST_OS', d)}' > >> +cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' > >> +cpu = '${HOST_ARCH}' > >> +endian = '${@meson_endian('HOST', d)}' > >> + > >> +[target_machine] > >> +system = '${@meson_operating_system('TARGET_OS', d)}' > >> +cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' > >> +cpu = '${TARGET_ARCH}' > >> +endian = '${@meson_endian('TARGET', d)}' > >> +EOF > >> + > >> + cat >${WORKDIR}/meson.native <<EOF > >> +[binaries] > >> +c = ${@meson_array('BUILD_CC', d)} > >> +cpp = ${@meson_array('BUILD_CXX', d)} > >> +cython = 'cython3' > >> +ar = ${@meson_array('BUILD_AR', d)} > >> +nm = ${@meson_array('BUILD_NM', d)} > >> +strip = ${@meson_array('BUILD_STRIP', d)} > >> +readelf = ${@meson_array('BUILD_READELF', d)} > >> +objcopy = ${@meson_array('BUILD_OBJCOPY', d)} > >> +pkgconfig = 'pkg-config-native' > >> +${@rust_tool(d, "BUILD_SYS")} > >> + > >> +[built-in options] > >> +c_args = ${@meson_array('BUILD_CFLAGS', d)} > >> +c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > >> +cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} > >> +cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > >> +EOF > >> +} > >> + > >> +do_write_config:append:class-target() { > >> + # Write out a qemu wrapper that will be used as exe_wrapper so that meson > >> + # can run target helper binaries through that. > >> + qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" > >> + cat > ${WORKDIR}/meson-qemuwrapper << EOF > >> +#!/bin/sh > >> +# Use a modules directory which doesn't exist so we don't load random things > >> +# which may then get deleted (or their dependencies) and potentially segfault > >> +export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy > >> + > >> +# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly > >> +unset LD_LIBRARY_PATH > >> + > >> +$qemu_binary "\$@" > >> +EOF > >> + chmod +x ${WORKDIR}/meson-qemuwrapper > >> +} > >> diff --git a/meta/classes-recipe/meson.bbclass b/meta/classes-recipe/meson.bbclass > >> index 48688bed75..697cf6ecc8 100644 > >> --- a/meta/classes-recipe/meson.bbclass > >> +++ b/meta/classes-recipe/meson.bbclass > >> @@ -4,141 +4,7 @@ > >> # SPDX-License-Identifier: MIT > >> # > >> > >> -inherit python3native meson-routines qemu > >> - > >> -DEPENDS:append = " meson-native ninja-native" > >> - > >> -EXEWRAPPER_ENABLED:class-native = "False" > >> -EXEWRAPPER_ENABLED:class-nativesdk = "False" > >> -EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" > >> -DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" > >> - > >> -# As Meson enforces out-of-tree builds we can just use cleandirs > >> -B = "${WORKDIR}/build" > >> -do_configure[cleandirs] = "${B}" > >> - > >> -# Where the meson.build build configuration is > >> -MESON_SOURCEPATH = "${S}" > >> - > >> -def noprefix(var, d): > >> - return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) > >> - > >> -MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" > >> -MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" > >> -MESONOPTS = " --prefix ${prefix} \ > >> - --buildtype ${MESON_BUILDTYPE} \ > >> - --bindir ${@noprefix('bindir', d)} \ > >> - --sbindir ${@noprefix('sbindir', d)} \ > >> - --datadir ${@noprefix('datadir', d)} \ > >> - --libdir ${@noprefix('libdir', d)} \ > >> - --libexecdir ${@noprefix('libexecdir', d)} \ > >> - --includedir ${@noprefix('includedir', d)} \ > >> - --mandir ${@noprefix('mandir', d)} \ > >> - --infodir ${@noprefix('infodir', d)} \ > >> - --sysconfdir ${sysconfdir} \ > >> - --localstatedir ${localstatedir} \ > >> - --sharedstatedir ${sharedstatedir} \ > >> - --wrap-mode nodownload \ > >> - --native-file ${WORKDIR}/meson.native" > >> - > >> -EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" > >> - > >> -MESON_CROSS_FILE = "" > >> -MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" > >> -MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" > >> - > >> -# Needed to set up qemu wrapper below > >> -export STAGING_DIR_HOST > >> - > >> -def rust_tool(d, target_var): > >> - rustc = d.getVar('RUSTC') > >> - if not rustc: > >> - return "" > >> - cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() > >> - return "rust = %s" % repr(cmd) > >> - > >> -addtask write_config before do_configure > >> -do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" > >> -do_write_config() { > >> - # This needs to be Py to split the args into single-element lists > >> - cat >${WORKDIR}/meson.cross <<EOF > >> -[binaries] > >> -c = ${@meson_array('CC', d)} > >> -cpp = ${@meson_array('CXX', d)} > >> -cython = 'cython3' > >> -ar = ${@meson_array('AR', d)} > >> -nm = ${@meson_array('NM', d)} > >> -strip = ${@meson_array('STRIP', d)} > >> -readelf = ${@meson_array('READELF', d)} > >> -objcopy = ${@meson_array('OBJCOPY', d)} > >> -pkgconfig = 'pkg-config' > >> -llvm-config = 'llvm-config' > >> -cups-config = 'cups-config' > >> -g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' > >> -g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' > >> -${@rust_tool(d, "HOST_SYS")} > >> -${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} > >> - > >> -[built-in options] > >> -c_args = ${@meson_array('CFLAGS', d)} > >> -c_link_args = ${@meson_array('LDFLAGS', d)} > >> -cpp_args = ${@meson_array('CXXFLAGS', d)} > >> -cpp_link_args = ${@meson_array('LDFLAGS', d)} > >> - > >> -[properties] > >> -needs_exe_wrapper = true > >> - > >> -[host_machine] > >> -system = '${@meson_operating_system('HOST_OS', d)}' > >> -cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' > >> -cpu = '${HOST_ARCH}' > >> -endian = '${@meson_endian('HOST', d)}' > >> - > >> -[target_machine] > >> -system = '${@meson_operating_system('TARGET_OS', d)}' > >> -cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' > >> -cpu = '${TARGET_ARCH}' > >> -endian = '${@meson_endian('TARGET', d)}' > >> -EOF > >> - > >> - cat >${WORKDIR}/meson.native <<EOF > >> -[binaries] > >> -c = ${@meson_array('BUILD_CC', d)} > >> -cpp = ${@meson_array('BUILD_CXX', d)} > >> -cython = 'cython3' > >> -ar = ${@meson_array('BUILD_AR', d)} > >> -nm = ${@meson_array('BUILD_NM', d)} > >> -strip = ${@meson_array('BUILD_STRIP', d)} > >> -readelf = ${@meson_array('BUILD_READELF', d)} > >> -objcopy = ${@meson_array('BUILD_OBJCOPY', d)} > >> -pkgconfig = 'pkg-config-native' > >> -${@rust_tool(d, "BUILD_SYS")} > >> - > >> -[built-in options] > >> -c_args = ${@meson_array('BUILD_CFLAGS', d)} > >> -c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > >> -cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} > >> -cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} > >> -EOF > >> -} > >> - > >> -do_write_config:append:class-target() { > >> - # Write out a qemu wrapper that will be used as exe_wrapper so that meson > >> - # can run target helper binaries through that. > >> - qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" > >> - cat > ${WORKDIR}/meson-qemuwrapper << EOF > >> -#!/bin/sh > >> -# Use a modules directory which doesn't exist so we don't load random things > >> -# which may then get deleted (or their dependencies) and potentially segfault > >> -export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy > >> - > >> -# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly > >> -unset LD_LIBRARY_PATH > >> - > >> -$qemu_binary "\$@" > >> -EOF > >> - chmod +x ${WORKDIR}/meson-qemuwrapper > >> -} > >> +inherit meson-env > >> > >> # Tell externalsrc that changes to this file require a reconfigure > >> CONFIGURE_FILES = "meson.build" > >> -- > >> 2.39.2 > >> > >> > >> -=-=-=-=-=-=-=-=-=-=-=- > >> Links: You receive all messages sent to this group. > >> View/Reply Online (#179011): https://lists.openembedded.org/g/openembedded-core/message/179011 > >> Mute This Topic: https://lists.openembedded.org/mt/97816812/1686489 > >> Group Owner: openembedded-core+owner@lists.openembedded.org > >> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com] > >> -=-=-=-=-=-=-=-=-=-=-=- > >> >
Sure, I will send v3 shortly. 2023. 03. 24. 10:31 keltezéssel, Alexander Kanavin írta: > Cam you please place this information into the commit message? At some > point someone will need to find out why this was done this way, and > email thread would by then be hopelessly undiscoverable. > > Alex > > On Fri, 24 Mar 2023 at 09:43, Böszörményi Zoltán <zboszor@gmail.com> wrote: >> 2023. 03. 24. 8:47 keltezéssel, Alexander Kanavin írta: >>> It would help if you explain why existing meson class can't be used >>> directly, and what the meson class adds compared to meson-env that >>> gets in the way of that. >> The email thread for the mesonpy bbclass in >> openembedded-devel lists all the problems. >> >> Summary: >> * Both meson and python_pep517 classes declare >> EXPORT_FUNCTION. For some reason, meson always wins >> regardless of the inheritance order. The mesonpy class >> needs the meson cross compiler environment using the >> pep517 configure/compile/install functions. >> * The meson class adds do_qa_configure which fails because >> the mesonpy build moves the meson setup phase from >> do_configure to do_compile. Removing items from >> do_configure[postfuncs] is impossible because this results >> in a parse error: >> do_configure[postfuncs]:remove = "meson_do_qa_configure" >> >> The only option left is to split the environment setup part >> out of meson.bbclass. >> >>> Alex >>> >>> On Fri, 24 Mar 2023 at 04:13, Zoltan Boszormenyi <zboszor@gmail.com> wrote: >>>> The new meson-env class will be used by a new PEP517 python >>>> build class using meson-python a.k.a. mesonpy. >>>> >>>> Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> >>>> --- >>>> v2: The split-off part is called meson-env.bbclass >>>> because "common" is not liked. >>>> >>>> meta/classes-recipe/meson-env.bbclass | 141 ++++++++++++++++++++++++++ >>>> meta/classes-recipe/meson.bbclass | 136 +------------------------ >>>> 2 files changed, 142 insertions(+), 135 deletions(-) >>>> create mode 100644 meta/classes-recipe/meson-env.bbclass >>>> >>>> diff --git a/meta/classes-recipe/meson-env.bbclass b/meta/classes-recipe/meson-env.bbclass >>>> new file mode 100644 >>>> index 0000000000..e02b3e5ab6 >>>> --- /dev/null >>>> +++ b/meta/classes-recipe/meson-env.bbclass >>>> @@ -0,0 +1,141 @@ >>>> +# >>>> +# Copyright OpenEmbedded Contributors >>>> +# >>>> +# SPDX-License-Identifier: MIT >>>> +# >>>> + >>>> +inherit python3native meson-routines qemu >>>> + >>>> +DEPENDS:append = " meson-native ninja-native" >>>> + >>>> +EXEWRAPPER_ENABLED:class-native = "False" >>>> +EXEWRAPPER_ENABLED:class-nativesdk = "False" >>>> +EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" >>>> +DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" >>>> + >>>> +# As Meson enforces out-of-tree builds we can just use cleandirs >>>> +B = "${WORKDIR}/build" >>>> +do_configure[cleandirs] = "${B}" >>>> + >>>> +# Where the meson.build build configuration is >>>> +MESON_SOURCEPATH = "${S}" >>>> + >>>> +def noprefix(var, d): >>>> + return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) >>>> + >>>> +MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" >>>> +MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" >>>> +MESONOPTS = " --prefix ${prefix} \ >>>> + --buildtype ${MESON_BUILDTYPE} \ >>>> + --bindir ${@noprefix('bindir', d)} \ >>>> + --sbindir ${@noprefix('sbindir', d)} \ >>>> + --datadir ${@noprefix('datadir', d)} \ >>>> + --libdir ${@noprefix('libdir', d)} \ >>>> + --libexecdir ${@noprefix('libexecdir', d)} \ >>>> + --includedir ${@noprefix('includedir', d)} \ >>>> + --mandir ${@noprefix('mandir', d)} \ >>>> + --infodir ${@noprefix('infodir', d)} \ >>>> + --sysconfdir ${sysconfdir} \ >>>> + --localstatedir ${localstatedir} \ >>>> + --sharedstatedir ${sharedstatedir} \ >>>> + --wrap-mode nodownload \ >>>> + --native-file ${WORKDIR}/meson.native" >>>> + >>>> +EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" >>>> + >>>> +MESON_CROSS_FILE = "" >>>> +MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" >>>> +MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" >>>> + >>>> +# Needed to set up qemu wrapper below >>>> +export STAGING_DIR_HOST >>>> + >>>> +def rust_tool(d, target_var): >>>> + rustc = d.getVar('RUSTC') >>>> + if not rustc: >>>> + return "" >>>> + cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() >>>> + return "rust = %s" % repr(cmd) >>>> + >>>> +addtask write_config before do_configure >>>> +do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" >>>> +do_write_config() { >>>> + # This needs to be Py to split the args into single-element lists >>>> + cat >${WORKDIR}/meson.cross <<EOF >>>> +[binaries] >>>> +c = ${@meson_array('CC', d)} >>>> +cpp = ${@meson_array('CXX', d)} >>>> +cython = 'cython3' >>>> +ar = ${@meson_array('AR', d)} >>>> +nm = ${@meson_array('NM', d)} >>>> +strip = ${@meson_array('STRIP', d)} >>>> +readelf = ${@meson_array('READELF', d)} >>>> +objcopy = ${@meson_array('OBJCOPY', d)} >>>> +pkgconfig = 'pkg-config' >>>> +llvm-config = 'llvm-config' >>>> +cups-config = 'cups-config' >>>> +g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' >>>> +g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' >>>> +${@rust_tool(d, "HOST_SYS")} >>>> +${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} >>>> + >>>> +[built-in options] >>>> +c_args = ${@meson_array('CFLAGS', d)} >>>> +c_link_args = ${@meson_array('LDFLAGS', d)} >>>> +cpp_args = ${@meson_array('CXXFLAGS', d)} >>>> +cpp_link_args = ${@meson_array('LDFLAGS', d)} >>>> + >>>> +[properties] >>>> +needs_exe_wrapper = true >>>> + >>>> +[host_machine] >>>> +system = '${@meson_operating_system('HOST_OS', d)}' >>>> +cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' >>>> +cpu = '${HOST_ARCH}' >>>> +endian = '${@meson_endian('HOST', d)}' >>>> + >>>> +[target_machine] >>>> +system = '${@meson_operating_system('TARGET_OS', d)}' >>>> +cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' >>>> +cpu = '${TARGET_ARCH}' >>>> +endian = '${@meson_endian('TARGET', d)}' >>>> +EOF >>>> + >>>> + cat >${WORKDIR}/meson.native <<EOF >>>> +[binaries] >>>> +c = ${@meson_array('BUILD_CC', d)} >>>> +cpp = ${@meson_array('BUILD_CXX', d)} >>>> +cython = 'cython3' >>>> +ar = ${@meson_array('BUILD_AR', d)} >>>> +nm = ${@meson_array('BUILD_NM', d)} >>>> +strip = ${@meson_array('BUILD_STRIP', d)} >>>> +readelf = ${@meson_array('BUILD_READELF', d)} >>>> +objcopy = ${@meson_array('BUILD_OBJCOPY', d)} >>>> +pkgconfig = 'pkg-config-native' >>>> +${@rust_tool(d, "BUILD_SYS")} >>>> + >>>> +[built-in options] >>>> +c_args = ${@meson_array('BUILD_CFLAGS', d)} >>>> +c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >>>> +cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} >>>> +cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >>>> +EOF >>>> +} >>>> + >>>> +do_write_config:append:class-target() { >>>> + # Write out a qemu wrapper that will be used as exe_wrapper so that meson >>>> + # can run target helper binaries through that. >>>> + qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" >>>> + cat > ${WORKDIR}/meson-qemuwrapper << EOF >>>> +#!/bin/sh >>>> +# Use a modules directory which doesn't exist so we don't load random things >>>> +# which may then get deleted (or their dependencies) and potentially segfault >>>> +export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy >>>> + >>>> +# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly >>>> +unset LD_LIBRARY_PATH >>>> + >>>> +$qemu_binary "\$@" >>>> +EOF >>>> + chmod +x ${WORKDIR}/meson-qemuwrapper >>>> +} >>>> diff --git a/meta/classes-recipe/meson.bbclass b/meta/classes-recipe/meson.bbclass >>>> index 48688bed75..697cf6ecc8 100644 >>>> --- a/meta/classes-recipe/meson.bbclass >>>> +++ b/meta/classes-recipe/meson.bbclass >>>> @@ -4,141 +4,7 @@ >>>> # SPDX-License-Identifier: MIT >>>> # >>>> >>>> -inherit python3native meson-routines qemu >>>> - >>>> -DEPENDS:append = " meson-native ninja-native" >>>> - >>>> -EXEWRAPPER_ENABLED:class-native = "False" >>>> -EXEWRAPPER_ENABLED:class-nativesdk = "False" >>>> -EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" >>>> -DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" >>>> - >>>> -# As Meson enforces out-of-tree builds we can just use cleandirs >>>> -B = "${WORKDIR}/build" >>>> -do_configure[cleandirs] = "${B}" >>>> - >>>> -# Where the meson.build build configuration is >>>> -MESON_SOURCEPATH = "${S}" >>>> - >>>> -def noprefix(var, d): >>>> - return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) >>>> - >>>> -MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" >>>> -MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" >>>> -MESONOPTS = " --prefix ${prefix} \ >>>> - --buildtype ${MESON_BUILDTYPE} \ >>>> - --bindir ${@noprefix('bindir', d)} \ >>>> - --sbindir ${@noprefix('sbindir', d)} \ >>>> - --datadir ${@noprefix('datadir', d)} \ >>>> - --libdir ${@noprefix('libdir', d)} \ >>>> - --libexecdir ${@noprefix('libexecdir', d)} \ >>>> - --includedir ${@noprefix('includedir', d)} \ >>>> - --mandir ${@noprefix('mandir', d)} \ >>>> - --infodir ${@noprefix('infodir', d)} \ >>>> - --sysconfdir ${sysconfdir} \ >>>> - --localstatedir ${localstatedir} \ >>>> - --sharedstatedir ${sharedstatedir} \ >>>> - --wrap-mode nodownload \ >>>> - --native-file ${WORKDIR}/meson.native" >>>> - >>>> -EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" >>>> - >>>> -MESON_CROSS_FILE = "" >>>> -MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" >>>> -MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" >>>> - >>>> -# Needed to set up qemu wrapper below >>>> -export STAGING_DIR_HOST >>>> - >>>> -def rust_tool(d, target_var): >>>> - rustc = d.getVar('RUSTC') >>>> - if not rustc: >>>> - return "" >>>> - cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() >>>> - return "rust = %s" % repr(cmd) >>>> - >>>> -addtask write_config before do_configure >>>> -do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" >>>> -do_write_config() { >>>> - # This needs to be Py to split the args into single-element lists >>>> - cat >${WORKDIR}/meson.cross <<EOF >>>> -[binaries] >>>> -c = ${@meson_array('CC', d)} >>>> -cpp = ${@meson_array('CXX', d)} >>>> -cython = 'cython3' >>>> -ar = ${@meson_array('AR', d)} >>>> -nm = ${@meson_array('NM', d)} >>>> -strip = ${@meson_array('STRIP', d)} >>>> -readelf = ${@meson_array('READELF', d)} >>>> -objcopy = ${@meson_array('OBJCOPY', d)} >>>> -pkgconfig = 'pkg-config' >>>> -llvm-config = 'llvm-config' >>>> -cups-config = 'cups-config' >>>> -g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' >>>> -g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' >>>> -${@rust_tool(d, "HOST_SYS")} >>>> -${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} >>>> - >>>> -[built-in options] >>>> -c_args = ${@meson_array('CFLAGS', d)} >>>> -c_link_args = ${@meson_array('LDFLAGS', d)} >>>> -cpp_args = ${@meson_array('CXXFLAGS', d)} >>>> -cpp_link_args = ${@meson_array('LDFLAGS', d)} >>>> - >>>> -[properties] >>>> -needs_exe_wrapper = true >>>> - >>>> -[host_machine] >>>> -system = '${@meson_operating_system('HOST_OS', d)}' >>>> -cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' >>>> -cpu = '${HOST_ARCH}' >>>> -endian = '${@meson_endian('HOST', d)}' >>>> - >>>> -[target_machine] >>>> -system = '${@meson_operating_system('TARGET_OS', d)}' >>>> -cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' >>>> -cpu = '${TARGET_ARCH}' >>>> -endian = '${@meson_endian('TARGET', d)}' >>>> -EOF >>>> - >>>> - cat >${WORKDIR}/meson.native <<EOF >>>> -[binaries] >>>> -c = ${@meson_array('BUILD_CC', d)} >>>> -cpp = ${@meson_array('BUILD_CXX', d)} >>>> -cython = 'cython3' >>>> -ar = ${@meson_array('BUILD_AR', d)} >>>> -nm = ${@meson_array('BUILD_NM', d)} >>>> -strip = ${@meson_array('BUILD_STRIP', d)} >>>> -readelf = ${@meson_array('BUILD_READELF', d)} >>>> -objcopy = ${@meson_array('BUILD_OBJCOPY', d)} >>>> -pkgconfig = 'pkg-config-native' >>>> -${@rust_tool(d, "BUILD_SYS")} >>>> - >>>> -[built-in options] >>>> -c_args = ${@meson_array('BUILD_CFLAGS', d)} >>>> -c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >>>> -cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} >>>> -cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} >>>> -EOF >>>> -} >>>> - >>>> -do_write_config:append:class-target() { >>>> - # Write out a qemu wrapper that will be used as exe_wrapper so that meson >>>> - # can run target helper binaries through that. >>>> - qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" >>>> - cat > ${WORKDIR}/meson-qemuwrapper << EOF >>>> -#!/bin/sh >>>> -# Use a modules directory which doesn't exist so we don't load random things >>>> -# which may then get deleted (or their dependencies) and potentially segfault >>>> -export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy >>>> - >>>> -# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly >>>> -unset LD_LIBRARY_PATH >>>> - >>>> -$qemu_binary "\$@" >>>> -EOF >>>> - chmod +x ${WORKDIR}/meson-qemuwrapper >>>> -} >>>> +inherit meson-env >>>> >>>> # Tell externalsrc that changes to this file require a reconfigure >>>> CONFIGURE_FILES = "meson.build" >>>> -- >>>> 2.39.2 >>>> >>>> >>>> -=-=-=-=-=-=-=-=-=-=-=- >>>> Links: You receive all messages sent to this group. >>>> View/Reply Online (#179011): https://lists.openembedded.org/g/openembedded-core/message/179011 >>>> Mute This Topic: https://lists.openembedded.org/mt/97816812/1686489 >>>> Group Owner: openembedded-core+owner@lists.openembedded.org >>>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com] >>>> -=-=-=-=-=-=-=-=-=-=-=- >>>>
diff --git a/meta/classes-recipe/meson-env.bbclass b/meta/classes-recipe/meson-env.bbclass new file mode 100644 index 0000000000..e02b3e5ab6 --- /dev/null +++ b/meta/classes-recipe/meson-env.bbclass @@ -0,0 +1,141 @@ +# +# Copyright OpenEmbedded Contributors +# +# SPDX-License-Identifier: MIT +# + +inherit python3native meson-routines qemu + +DEPENDS:append = " meson-native ninja-native" + +EXEWRAPPER_ENABLED:class-native = "False" +EXEWRAPPER_ENABLED:class-nativesdk = "False" +EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" +DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" + +# As Meson enforces out-of-tree builds we can just use cleandirs +B = "${WORKDIR}/build" +do_configure[cleandirs] = "${B}" + +# Where the meson.build build configuration is +MESON_SOURCEPATH = "${S}" + +def noprefix(var, d): + return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) + +MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" +MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" +MESONOPTS = " --prefix ${prefix} \ + --buildtype ${MESON_BUILDTYPE} \ + --bindir ${@noprefix('bindir', d)} \ + --sbindir ${@noprefix('sbindir', d)} \ + --datadir ${@noprefix('datadir', d)} \ + --libdir ${@noprefix('libdir', d)} \ + --libexecdir ${@noprefix('libexecdir', d)} \ + --includedir ${@noprefix('includedir', d)} \ + --mandir ${@noprefix('mandir', d)} \ + --infodir ${@noprefix('infodir', d)} \ + --sysconfdir ${sysconfdir} \ + --localstatedir ${localstatedir} \ + --sharedstatedir ${sharedstatedir} \ + --wrap-mode nodownload \ + --native-file ${WORKDIR}/meson.native" + +EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" + +MESON_CROSS_FILE = "" +MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" +MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" + +# Needed to set up qemu wrapper below +export STAGING_DIR_HOST + +def rust_tool(d, target_var): + rustc = d.getVar('RUSTC') + if not rustc: + return "" + cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() + return "rust = %s" % repr(cmd) + +addtask write_config before do_configure +do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" +do_write_config() { + # This needs to be Py to split the args into single-element lists + cat >${WORKDIR}/meson.cross <<EOF +[binaries] +c = ${@meson_array('CC', d)} +cpp = ${@meson_array('CXX', d)} +cython = 'cython3' +ar = ${@meson_array('AR', d)} +nm = ${@meson_array('NM', d)} +strip = ${@meson_array('STRIP', d)} +readelf = ${@meson_array('READELF', d)} +objcopy = ${@meson_array('OBJCOPY', d)} +pkgconfig = 'pkg-config' +llvm-config = 'llvm-config' +cups-config = 'cups-config' +g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' +g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' +${@rust_tool(d, "HOST_SYS")} +${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} + +[built-in options] +c_args = ${@meson_array('CFLAGS', d)} +c_link_args = ${@meson_array('LDFLAGS', d)} +cpp_args = ${@meson_array('CXXFLAGS', d)} +cpp_link_args = ${@meson_array('LDFLAGS', d)} + +[properties] +needs_exe_wrapper = true + +[host_machine] +system = '${@meson_operating_system('HOST_OS', d)}' +cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' +cpu = '${HOST_ARCH}' +endian = '${@meson_endian('HOST', d)}' + +[target_machine] +system = '${@meson_operating_system('TARGET_OS', d)}' +cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' +cpu = '${TARGET_ARCH}' +endian = '${@meson_endian('TARGET', d)}' +EOF + + cat >${WORKDIR}/meson.native <<EOF +[binaries] +c = ${@meson_array('BUILD_CC', d)} +cpp = ${@meson_array('BUILD_CXX', d)} +cython = 'cython3' +ar = ${@meson_array('BUILD_AR', d)} +nm = ${@meson_array('BUILD_NM', d)} +strip = ${@meson_array('BUILD_STRIP', d)} +readelf = ${@meson_array('BUILD_READELF', d)} +objcopy = ${@meson_array('BUILD_OBJCOPY', d)} +pkgconfig = 'pkg-config-native' +${@rust_tool(d, "BUILD_SYS")} + +[built-in options] +c_args = ${@meson_array('BUILD_CFLAGS', d)} +c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} +cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} +cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} +EOF +} + +do_write_config:append:class-target() { + # Write out a qemu wrapper that will be used as exe_wrapper so that meson + # can run target helper binaries through that. + qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" + cat > ${WORKDIR}/meson-qemuwrapper << EOF +#!/bin/sh +# Use a modules directory which doesn't exist so we don't load random things +# which may then get deleted (or their dependencies) and potentially segfault +export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy + +# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly +unset LD_LIBRARY_PATH + +$qemu_binary "\$@" +EOF + chmod +x ${WORKDIR}/meson-qemuwrapper +} diff --git a/meta/classes-recipe/meson.bbclass b/meta/classes-recipe/meson.bbclass index 48688bed75..697cf6ecc8 100644 --- a/meta/classes-recipe/meson.bbclass +++ b/meta/classes-recipe/meson.bbclass @@ -4,141 +4,7 @@ # SPDX-License-Identifier: MIT # -inherit python3native meson-routines qemu - -DEPENDS:append = " meson-native ninja-native" - -EXEWRAPPER_ENABLED:class-native = "False" -EXEWRAPPER_ENABLED:class-nativesdk = "False" -EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}" -DEPENDS:append = "${@' qemu-native' if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ''}" - -# As Meson enforces out-of-tree builds we can just use cleandirs -B = "${WORKDIR}/build" -do_configure[cleandirs] = "${B}" - -# Where the meson.build build configuration is -MESON_SOURCEPATH = "${S}" - -def noprefix(var, d): - return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) - -MESON_BUILDTYPE ?= "${@oe.utils.vartrue('DEBUG_BUILD', 'debug', 'plain', d)}" -MESON_BUILDTYPE[vardeps] += "DEBUG_BUILD" -MESONOPTS = " --prefix ${prefix} \ - --buildtype ${MESON_BUILDTYPE} \ - --bindir ${@noprefix('bindir', d)} \ - --sbindir ${@noprefix('sbindir', d)} \ - --datadir ${@noprefix('datadir', d)} \ - --libdir ${@noprefix('libdir', d)} \ - --libexecdir ${@noprefix('libexecdir', d)} \ - --includedir ${@noprefix('includedir', d)} \ - --mandir ${@noprefix('mandir', d)} \ - --infodir ${@noprefix('infodir', d)} \ - --sysconfdir ${sysconfdir} \ - --localstatedir ${localstatedir} \ - --sharedstatedir ${sharedstatedir} \ - --wrap-mode nodownload \ - --native-file ${WORKDIR}/meson.native" - -EXTRA_OEMESON:append = " ${PACKAGECONFIG_CONFARGS}" - -MESON_CROSS_FILE = "" -MESON_CROSS_FILE:class-target = "--cross-file ${WORKDIR}/meson.cross" -MESON_CROSS_FILE:class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" - -# Needed to set up qemu wrapper below -export STAGING_DIR_HOST - -def rust_tool(d, target_var): - rustc = d.getVar('RUSTC') - if not rustc: - return "" - cmd = [rustc, "--target", d.getVar(target_var)] + d.getVar("RUSTFLAGS").split() - return "rust = %s" % repr(cmd) - -addtask write_config before do_configure -do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS RUSTC RUSTFLAGS" -do_write_config() { - # This needs to be Py to split the args into single-element lists - cat >${WORKDIR}/meson.cross <<EOF -[binaries] -c = ${@meson_array('CC', d)} -cpp = ${@meson_array('CXX', d)} -cython = 'cython3' -ar = ${@meson_array('AR', d)} -nm = ${@meson_array('NM', d)} -strip = ${@meson_array('STRIP', d)} -readelf = ${@meson_array('READELF', d)} -objcopy = ${@meson_array('OBJCOPY', d)} -pkgconfig = 'pkg-config' -llvm-config = 'llvm-config' -cups-config = 'cups-config' -g-ir-scanner = '${STAGING_BINDIR}/g-ir-scanner-wrapper' -g-ir-compiler = '${STAGING_BINDIR}/g-ir-compiler-wrapper' -${@rust_tool(d, "HOST_SYS")} -${@"exe_wrapper = '${WORKDIR}/meson-qemuwrapper'" if d.getVar('EXEWRAPPER_ENABLED') == 'True' else ""} - -[built-in options] -c_args = ${@meson_array('CFLAGS', d)} -c_link_args = ${@meson_array('LDFLAGS', d)} -cpp_args = ${@meson_array('CXXFLAGS', d)} -cpp_link_args = ${@meson_array('LDFLAGS', d)} - -[properties] -needs_exe_wrapper = true - -[host_machine] -system = '${@meson_operating_system('HOST_OS', d)}' -cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' -cpu = '${HOST_ARCH}' -endian = '${@meson_endian('HOST', d)}' - -[target_machine] -system = '${@meson_operating_system('TARGET_OS', d)}' -cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' -cpu = '${TARGET_ARCH}' -endian = '${@meson_endian('TARGET', d)}' -EOF - - cat >${WORKDIR}/meson.native <<EOF -[binaries] -c = ${@meson_array('BUILD_CC', d)} -cpp = ${@meson_array('BUILD_CXX', d)} -cython = 'cython3' -ar = ${@meson_array('BUILD_AR', d)} -nm = ${@meson_array('BUILD_NM', d)} -strip = ${@meson_array('BUILD_STRIP', d)} -readelf = ${@meson_array('BUILD_READELF', d)} -objcopy = ${@meson_array('BUILD_OBJCOPY', d)} -pkgconfig = 'pkg-config-native' -${@rust_tool(d, "BUILD_SYS")} - -[built-in options] -c_args = ${@meson_array('BUILD_CFLAGS', d)} -c_link_args = ${@meson_array('BUILD_LDFLAGS', d)} -cpp_args = ${@meson_array('BUILD_CXXFLAGS', d)} -cpp_link_args = ${@meson_array('BUILD_LDFLAGS', d)} -EOF -} - -do_write_config:append:class-target() { - # Write out a qemu wrapper that will be used as exe_wrapper so that meson - # can run target helper binaries through that. - qemu_binary="${@qemu_wrapper_cmdline(d, '$STAGING_DIR_HOST', ['$STAGING_DIR_HOST/${libdir}','$STAGING_DIR_HOST/${base_libdir}'])}" - cat > ${WORKDIR}/meson-qemuwrapper << EOF -#!/bin/sh -# Use a modules directory which doesn't exist so we don't load random things -# which may then get deleted (or their dependencies) and potentially segfault -export GIO_MODULE_DIR=${STAGING_LIBDIR}/gio/modules-dummy - -# meson sets this wrongly (only to libs in build-dir), qemu_wrapper_cmdline() and GIR_EXTRA_LIBS_PATH take care of it properly -unset LD_LIBRARY_PATH - -$qemu_binary "\$@" -EOF - chmod +x ${WORKDIR}/meson-qemuwrapper -} +inherit meson-env # Tell externalsrc that changes to this file require a reconfigure CONFIGURE_FILES = "meson.build"
The new meson-env class will be used by a new PEP517 python build class using meson-python a.k.a. mesonpy. Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> --- v2: The split-off part is called meson-env.bbclass because "common" is not liked. meta/classes-recipe/meson-env.bbclass | 141 ++++++++++++++++++++++++++ meta/classes-recipe/meson.bbclass | 136 +------------------------ 2 files changed, 142 insertions(+), 135 deletions(-) create mode 100644 meta/classes-recipe/meson-env.bbclass