Files
poky/meta/classes/meson.bbclass
Martin Kelly f437138784 meson: export native env only for native build
Although the meson crossfile should take care of setting the right cross
environment for a target build, meson slurps any set CFLAGS, CXXFLAGS,
LDFLAGS, and CPPFLAGS from the environment and injects them into the
build (see mesonbuild/environment.py:get_args_from_envvars for details).

This means that we are seeing native CFLAGS, CXXFLAGS, LDFLAGS, and
CPPFLAGS in the target build, which is wrong and causes build failures
when target and native have libraries in common (the linker gets
confused and bails).

That said, we *do* need to set certain vars for all builds so that meson
can find the right build tools. Without this, meson will fail during its
sanity checking step because it will determine the build tools to be
unrunnable since they output target instead of native artifacts.

The solution to all of this is to set CC, CXX, LD, and AR globally to
the native tools while setting the other native vars *only* for the
native build. For target builds, these vars will get overridden by the
cross file as we expect.

(From OE-Core rev: de7ae028c65a978969b2e06fdc1a2d08bc141a5b)

Signed-off-by: Martin Kelly <mkelly@xevo.com>
Signed-off-by: Alexander Kanavin <alexander.kanavin@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2018-01-05 12:02:37 +00:00

114 lines
3.4 KiB
Plaintext

inherit python3native
DEPENDS_append = " meson-native ninja-native"
# 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)
MESONOPTS = " --prefix ${prefix} \
--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}"
MESON_C_ARGS = "${TARGET_CC_ARCH}${TOOLCHAIN_OPTIONS}"
MESON_LINK_ARGS = "${MESON_C_ARGS} ${LDFLAGS}"
# both are required but not used by meson
MESON_HOST_ENDIAN = "bogus-endian"
MESON_TARGET_ENDIAN = "bogus-endian"
EXTRA_OEMESON += "${PACKAGECONFIG_CONFARGS}"
MESON_CROSS_FILE = ""
MESON_CROSS_FILE_class-target = "--cross-file ${WORKDIR}/meson.cross"
def meson_array(var, d):
return "', '".join(d.getVar(var).split()).join(("'", "'"))
addtask write_config before do_configure
do_write_config[vardeps] += "MESON_C_ARGS TOOLCHAIN_OPTIONS"
do_write_config() {
# This needs to be Py to split the args into single-element lists
cat >${WORKDIR}/meson.cross <<EOF
[binaries]
c = '${HOST_PREFIX}gcc'
cpp = '${HOST_PREFIX}g++'
ar = '${HOST_PREFIX}ar'
ld = '${HOST_PREFIX}ld'
strip = '${HOST_PREFIX}strip'
readelf = '${HOST_PREFIX}readelf'
pkgconfig = 'pkg-config'
[properties]
needs_exe_wrapper = true
c_args = [${@meson_array('MESON_C_ARGS', d)}]
c_link_args = [${@meson_array('MESON_LINK_ARGS', d)}]
cpp_args = [${@meson_array('MESON_C_ARGS', d)}]
cpp_link_args = [${@meson_array('MESON_LINK_ARGS', d)}]
gtkdoc_exe_wrapper = '${B}/gtkdoc-qemuwrapper'
[host_machine]
system = '${HOST_OS}'
cpu_family = '${HOST_ARCH}'
cpu = '${HOST_ARCH}'
endian = '${MESON_HOST_ENDIAN}'
[target_machine]
system = '${TARGET_OS}'
cpu_family = '${TARGET_ARCH}'
cpu = '${TARGET_ARCH}'
endian = '${MESON_TARGET_ENDIAN}'
EOF
}
CONFIGURE_FILES = "meson.build"
meson_do_configure() {
if ! meson ${MESONOPTS} "${MESON_SOURCEPATH}" "${B}" ${MESON_CROSS_FILE} ${EXTRA_OEMESON}; then
cat ${B}/meson-logs/meson-log.txt
bbfatal_log meson failed
fi
}
meson_do_configure_prepend_class-target() {
# Set these so that meson uses the native tools for its build sanity tests,
# which require executables to be runnable. The cross file will still
# override these for the target build. Note that we do *not* set CFLAGS,
# LDFLAGS, etc. as they will be slurped in by meson and applied to the
# target build, causing errors.
export CC="${BUILD_CC}"
export CXX="${BUILD_CXX}"
export LD="${BUILD_LD}"
export AR="${BUILD_AR}"
}
meson_do_configure_prepend_class-native() {
export PKG_CONFIG="pkg-config-native"
}
do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+"
meson_do_compile() {
ninja ${PARALLEL_MAKE}
}
meson_do_install() {
DESTDIR='${D}' ninja ${PARALLEL_MAKEINST} install
}
EXPORT_FUNCTIONS do_configure do_compile do_install