luajit: run the host helpers under qemu-user on non-x86 build hosts

LuaJIT's build compiles minilua and buildvm and runs them, and buildvm
must have the target's pointer size. For a 32 bit target the recipe adds
-m32 to the build compiler, which only exists on x86, so on any other
build host (e.g. AArch64) the build fails.

On those hosts, build the helpers with the target compiler and run them
under qemu-user. x86 build hosts keep -m32 unchanged.

AI-Generated: Claude Code (Claude Opus 5.5)
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Alex Kiernan authored and Khem Raj committed 2026-10-09 10:01:38 -07:00
1 parent 9ad83b4d5a
commit ba189f422c
1 file changed
+28 -9
+28 -9
View File
@@ -13,17 +13,30 @@ SRCREV = "659a61693aa3b87661864ad0f12eee14c865cd7f"
# The v2.1 branch is rolling with no tags; track commits.
UPSTREAM_CHECK_COMMITS = "1"
inherit pkgconfig binconfig siteinfo
inherit pkgconfig binconfig siteinfo qemu
BBCLASSEXTEND = "native"
# http://luajit.org/install.html#cross
# Host luajit needs to be compiled with the same pointer size
# If you want to cross-compile to any 32 bit target on an x64 OS,
# you need to install the multilib development package (e.g.
# libc6-dev:i386 on Debian/Ubuntu) and build a 32 bit host part
# (HOST_CC="gcc -m32").
BUILD_CC_ARCH:append = " ${@['-m32',''][d.getVar('SITEINFO_BITS') != '32']}"
# The build compiles helpers (minilua, buildvm) and runs them, and buildvm
# must have the target's pointer size. For a 32 bit target on an x86 build
# host they are built with "gcc -m32", which needs the multilib development
# package (e.g. libc6-dev:i386 on Debian/Ubuntu). Other build hosts have no
# -m32, so there the helpers are built with the target compiler and run under
# qemu-user instead, which needs a machine qemu-user can emulate
# (qemu-usermode in MACHINE_FEATURES).
LUAJIT_HOST_QEMU = "${@'1' if d.getVar('SITEINFO_BITS') == '32' and d.getVar('BUILD_ARCH') not in ('x86_64', 'i686') else ''}"
LUAJIT_HOST_QEMU:class-native = ""
BUILD_CC_ARCH:append = "${@' -m32' if d.getVar('SITEINFO_BITS') == '32' and not d.getVar('LUAJIT_HOST_QEMU') else ''}"
DEPENDS:append = "${@' qemu-native' if d.getVar('LUAJIT_HOST_QEMU') else ''}"
LUAJIT_HOST_OEMAKE = "'HOST_CC=${BUILD_CC}' 'HOST_CFLAGS=${BUILD_CFLAGS}'"
LUAJIT_HOST_OEMAKE_QEMU = "\
'HOST_CC=${CC}' 'HOST_CFLAGS=${CFLAGS}' 'HOST_LDFLAGS=${LDFLAGS}' \
'MINILUA_X=${WORKDIR}/luajit-qemuwrapper host/minilua' \
'BUILDVM_X=${WORKDIR}/luajit-qemuwrapper host/buildvm' \
"
# The lua makefiles expect the TARGET_SYS to be from uname -s
# Values: Windows, Linux, Darwin, iOS, SunOS, PS3, GNU/kFreeBSD
@@ -48,8 +61,7 @@ EXTRA_OEMAKE = "\
'TARGET_CFLAGS=${CFLAGS}' \
'TARGET_LDFLAGS=${LDFLAGS}' \
'TARGET_SHLDFLAGS=${LDFLAGS}' \
'HOST_CC=${BUILD_CC}' \
'HOST_CFLAGS=${BUILD_CFLAGS}' \
${@d.getVar('LUAJIT_HOST_OEMAKE_QEMU') if d.getVar('LUAJIT_HOST_QEMU') else d.getVar('LUAJIT_HOST_OEMAKE')} \
\
'PREFIX=${prefix}' \
'MULTILIB=${baselib}' \
@@ -57,6 +69,13 @@ EXTRA_OEMAKE = "\
"
do_compile () {
if [ -n "${LUAJIT_HOST_QEMU}" ]; then
cat > ${WORKDIR}/luajit-qemuwrapper <<EOF
#!/bin/sh
${@qemu_wrapper_cmdline(d, '${STAGING_DIR_HOST}', ['${STAGING_DIR_HOST}${libdir}', '${STAGING_DIR_HOST}${base_libdir}'])} "\$@"
EOF
chmod +x ${WORKDIR}/luajit-qemuwrapper
fi
oe_runmake
}