kumquat-buildroot/package/meson/meson.mk

77 lines
2.9 KiB
Makefile
Raw Normal View History

################################################################################
#
# meson
#
################################################################################
MESON_VERSION = 0.51.2
MESON_SITE = https://github.com/mesonbuild/meson/releases/download/$(MESON_VERSION)
MESON_LICENSE = Apache-2.0
MESON_LICENSE_FILES = COPYING
MESON_SETUP_TYPE = setuptools
HOST_MESON_DEPENDENCIES = host-ninja
HOST_MESON_NEEDS_HOST_PYTHON = python3
HOST_MESON_TARGET_ENDIAN = $(call LOWERCASE,$(BR2_ENDIAN))
HOST_MESON_TARGET_CPU = $(GCC_TARGET_CPU)
# https://mesonbuild.com/Reference-tables.html#cpu-families
ifeq ($(BR2_arcle)$(BR2_arceb),y)
HOST_MESON_TARGET_CPU_FAMILY = arc
else ifeq ($(BR2_arm)$(BR2_armeb),y)
HOST_MESON_TARGET_CPU_FAMILY = arm
else ifeq ($(BR2_aarch64)$(BR2_aarch64_be),y)
HOST_MESON_TARGET_CPU_FAMILY = aarch64
else ifeq ($(BR2_i386),y)
HOST_MESON_TARGET_CPU_FAMILY = x86
else ifeq ($(BR2_mips)$(BR2_mipsel),y)
HOST_MESON_TARGET_CPU_FAMILY = mips
else ifeq ($(BR2_mips64)$(BR2_mips64el),y)
HOST_MESON_TARGET_CPU_FAMILY = mips64
else ifeq ($(BR2_powerpc),y)
HOST_MESON_TARGET_CPU_FAMILY = ppc
else ifeq ($(BR2_powerpc64)$(BR2_powerpc64le),y)
HOST_MESON_TARGET_CPU_FAMILY = ppc64
else ifeq ($(BR2_riscv),y)
HOST_MESON_TARGET_CPU_FAMILY = riscv64
else ifeq ($(BR2_sparc),y)
HOST_MESON_TARGET_CPU_FAMILY = sparc
else ifeq ($(BR2_sparc64),y)
HOST_MESON_TARGET_CPU_FAMILY = sparc64
else ifeq ($(BR2_x86_64),y)
HOST_MESON_TARGET_CPU_FAMILY = x86_64
else
HOST_MESON_TARGET_CPU_FAMILY = $(ARCH)
endif
HOST_MESON_SED_CFLAGS = $(if $(strip $(TARGET_CFLAGS)),`printf '"%s"$(comma) ' $(TARGET_CFLAGS)`)
HOST_MESON_SED_LDFLAGS = $(if $(strip $(TARGET_LDFLAGS)),`printf '"%s"$(comma) ' $(TARGET_LDFLAGS)`)
HOST_MESON_SED_CXXFLAGS = $(if $(strip $(TARGET_CXXFLAGS)),`printf '"%s"$(comma) ' $(TARGET_CXXFLAGS)`)
package/pkg-meson: support per-package directories Currently, package/meson/meson.mk generates a single global cross-compilation.conf file, with the path to the compiler, cflags, ldflags, and various other details. This file is then used when building all meson-based packages. This causes two problems: - It is not compatible with per-package directories, because with per-package folders, we need to use a different compiler, and possibly CFLAGS/LDFLAGS for each package. - It is not possible to define per package CFLAGS. Indeed, when cross-compiling, meson doesn't support passing CFLAGS through the environment, only the CFLAGS from cross-compilation.conf are taken into account. For this reason, this commit: - Introduces a per-package cross-compilation.conf, which is generated by the pkg-meson infrastructure in the "configure" step right before calling meson. The file is generated in $(@D)/build/, and because it is generated within a given package "configure" step, the compiler path is the one of this package. - Keeps the global cross-compilation.conf in $(HOST_DIR)/etc/meson/, for the SDK use-case of Buildroot. Since we want the final and global values of the compiler path, CFLAGS and LDFLAGS, generating this global cross-compilation.conf is moved to a TARGET_FINALIZE_HOOKS. If we were keeping this as a HOST_MESON_POST_INSTALL_HOOKS, it would contain values specific to the host-meson package. For now, we don't yet support per-package CFLAGS/LDFLAGS, but having such per-package cross-compilation.conf is a necessary preparation to achieve this goal. This commit has been tested by building all Buildroot packages that use meson: json-glib, systemd, enlightenment, at-spi2-core, ncmpc, libmpdclient and ncmpc. Signed-off-by: Peter Seiderer <ps.report@gmx.net> [Thomas: - add extended commit log - in pkg-meson.mk, re-use variables defined in meson.mk to do the replacement of CFLAGS/LDFLAGS/CXXFLAGS - move the generation of the global cross-compilation.conf to a TARGET_FINALIZE_HOOKS - testing with per-package folders] Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2018-11-30 11:40:03 +01:00
# Generate a Meson cross-compilation.conf suitable for use with the
infra/pkg-meson: allow packages to pass custom compiler/linker flags Meson does not allow to pass CFLAGS/LDFLAGS/CXXFLAGS via the environment or via command-line arguments or options (instead, those flags from the environment are passed to the host compiler, which is seldom what we need). The only way to pas those flags is via the cross-compilation.conf file. Add LIBFOO_CFLAGS, LIBFOO_LDFLAGS and LIBFOO_CXXFLAGS variables to allow packages to provide their own flags, possibly overriding the generic ones entirely, as we allow for other infras. Those per-package flags will then be used to generate the per-package cross-compilation.conf. This means that the meson infra is the first and only infra for which FOO_CFLAGS, FOO_LDFLAGS, and FOO_CXXFLAGS are meaningful, while for the other infras, they are just variables private to the package itself. Instead of naming those variables after the meson infra (e.g. FOO_MESON_CFLAGS), we name them with a generic name, as maybe, just maybe, we could also change the other infras to also recognise those variables. Just like for the HOST_MESON_SED_CFLAGS etc., we need to add auxiliary variables to do convert the shell-formatted argument list into the JSON-formatted list that meson expects. We can't use a pure-make construct because the CFLAGS can contain quoting that needs to be expanded by the shell. Similarly, we need a condition on the strip'ed variable to avoid passing empty arguments. To mimic this feature for packages that are built from the SDK, we also install a templatised version of cross-compilation.conf, with three new placeholders for custom flags. If a user wants to build a package that needs custom flags, they can use that template to generate a per-package cross-compilation.conf. Signed-off-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Adam Duskett <aduskett@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2019-06-24 22:25:48 +02:00
# SDK; also install the file as a template for users to add their
# own flags if they need to.
define HOST_MESON_INSTALL_CROSS_CONF
mkdir -p $(HOST_DIR)/etc/meson
sed -e "s%@TARGET_CROSS@%$(TARGET_CROSS)%g" \
-e "s%@TARGET_ARCH@%$(HOST_MESON_TARGET_CPU_FAMILY)%g" \
-e "s%@TARGET_CPU@%$(HOST_MESON_TARGET_CPU)%g" \
-e "s%@TARGET_ENDIAN@%$(HOST_MESON_TARGET_ENDIAN)%g" \
infra/pkg-meson: allow packages to pass custom compiler/linker flags Meson does not allow to pass CFLAGS/LDFLAGS/CXXFLAGS via the environment or via command-line arguments or options (instead, those flags from the environment are passed to the host compiler, which is seldom what we need). The only way to pas those flags is via the cross-compilation.conf file. Add LIBFOO_CFLAGS, LIBFOO_LDFLAGS and LIBFOO_CXXFLAGS variables to allow packages to provide their own flags, possibly overriding the generic ones entirely, as we allow for other infras. Those per-package flags will then be used to generate the per-package cross-compilation.conf. This means that the meson infra is the first and only infra for which FOO_CFLAGS, FOO_LDFLAGS, and FOO_CXXFLAGS are meaningful, while for the other infras, they are just variables private to the package itself. Instead of naming those variables after the meson infra (e.g. FOO_MESON_CFLAGS), we name them with a generic name, as maybe, just maybe, we could also change the other infras to also recognise those variables. Just like for the HOST_MESON_SED_CFLAGS etc., we need to add auxiliary variables to do convert the shell-formatted argument list into the JSON-formatted list that meson expects. We can't use a pure-make construct because the CFLAGS can contain quoting that needs to be expanded by the shell. Similarly, we need a condition on the strip'ed variable to avoid passing empty arguments. To mimic this feature for packages that are built from the SDK, we also install a templatised version of cross-compilation.conf, with three new placeholders for custom flags. If a user wants to build a package that needs custom flags, they can use that template to generate a per-package cross-compilation.conf. Signed-off-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Adam Duskett <aduskett@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2019-06-24 22:25:48 +02:00
-e "s%@TARGET_CFLAGS@%$(HOST_MESON_SED_CFLAGS)@PKG_TARGET_CFLAGS@%g" \
-e "s%@TARGET_LDFLAGS@%$(HOST_MESON_SED_LDFLAGS)@PKG_TARGET_CFLAGS@%g" \
-e "s%@TARGET_CXXFLAGS@%$(HOST_MESON_SED_CXXFLAGS)@PKG_TARGET_CFLAGS@%g" \
-e "s%@HOST_DIR@%$(HOST_DIR)%g" \
$(HOST_MESON_PKGDIR)/cross-compilation.conf.in \
infra/pkg-meson: allow packages to pass custom compiler/linker flags Meson does not allow to pass CFLAGS/LDFLAGS/CXXFLAGS via the environment or via command-line arguments or options (instead, those flags from the environment are passed to the host compiler, which is seldom what we need). The only way to pas those flags is via the cross-compilation.conf file. Add LIBFOO_CFLAGS, LIBFOO_LDFLAGS and LIBFOO_CXXFLAGS variables to allow packages to provide their own flags, possibly overriding the generic ones entirely, as we allow for other infras. Those per-package flags will then be used to generate the per-package cross-compilation.conf. This means that the meson infra is the first and only infra for which FOO_CFLAGS, FOO_LDFLAGS, and FOO_CXXFLAGS are meaningful, while for the other infras, they are just variables private to the package itself. Instead of naming those variables after the meson infra (e.g. FOO_MESON_CFLAGS), we name them with a generic name, as maybe, just maybe, we could also change the other infras to also recognise those variables. Just like for the HOST_MESON_SED_CFLAGS etc., we need to add auxiliary variables to do convert the shell-formatted argument list into the JSON-formatted list that meson expects. We can't use a pure-make construct because the CFLAGS can contain quoting that needs to be expanded by the shell. Similarly, we need a condition on the strip'ed variable to avoid passing empty arguments. To mimic this feature for packages that are built from the SDK, we also install a templatised version of cross-compilation.conf, with three new placeholders for custom flags. If a user wants to build a package that needs custom flags, they can use that template to generate a per-package cross-compilation.conf. Signed-off-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Adam Duskett <aduskett@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2019-06-24 22:25:48 +02:00
> $(HOST_DIR)/etc/meson/cross-compilation.conf.in
sed -e "s%@PKG_TARGET_CFLAGS@%%g" \
-e "s%@PKG_TARGET_LDFLAGS@%%g" \
-e "s%@PKG_TARGET_CXXFLAGS@%%g" \
$(HOST_DIR)/etc/meson/cross-compilation.conf.in \
> $(HOST_DIR)/etc/meson/cross-compilation.conf
endef
package/pkg-meson: support per-package directories Currently, package/meson/meson.mk generates a single global cross-compilation.conf file, with the path to the compiler, cflags, ldflags, and various other details. This file is then used when building all meson-based packages. This causes two problems: - It is not compatible with per-package directories, because with per-package folders, we need to use a different compiler, and possibly CFLAGS/LDFLAGS for each package. - It is not possible to define per package CFLAGS. Indeed, when cross-compiling, meson doesn't support passing CFLAGS through the environment, only the CFLAGS from cross-compilation.conf are taken into account. For this reason, this commit: - Introduces a per-package cross-compilation.conf, which is generated by the pkg-meson infrastructure in the "configure" step right before calling meson. The file is generated in $(@D)/build/, and because it is generated within a given package "configure" step, the compiler path is the one of this package. - Keeps the global cross-compilation.conf in $(HOST_DIR)/etc/meson/, for the SDK use-case of Buildroot. Since we want the final and global values of the compiler path, CFLAGS and LDFLAGS, generating this global cross-compilation.conf is moved to a TARGET_FINALIZE_HOOKS. If we were keeping this as a HOST_MESON_POST_INSTALL_HOOKS, it would contain values specific to the host-meson package. For now, we don't yet support per-package CFLAGS/LDFLAGS, but having such per-package cross-compilation.conf is a necessary preparation to achieve this goal. This commit has been tested by building all Buildroot packages that use meson: json-glib, systemd, enlightenment, at-spi2-core, ncmpc, libmpdclient and ncmpc. Signed-off-by: Peter Seiderer <ps.report@gmx.net> [Thomas: - add extended commit log - in pkg-meson.mk, re-use variables defined in meson.mk to do the replacement of CFLAGS/LDFLAGS/CXXFLAGS - move the generation of the global cross-compilation.conf to a TARGET_FINALIZE_HOOKS - testing with per-package folders] Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Tested-by: Peter Seiderer <ps.report@gmx.net> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2018-11-30 11:40:03 +01:00
TARGET_FINALIZE_HOOKS += HOST_MESON_INSTALL_CROSS_CONF
$(eval $(host-python-package))