// -*- mode:doc; -*- // vim: set syntax=asciidoc: === Integration of Meson-based packages [[meson-package-tutorial]] ==== +meson-package+ tutorial http://mesonbuild.com[Meson] is an open source build system meant to be both extremely fast, and, even more importantly, as user friendly as possible. Buildroot does not (yet) provide a dedicated package infrastructure for meson-based packages. So, we will explain how to write a +.mk+ file for such a package. Let's start with an example: ------------------------------ 01: ################################################################################ 02: # 03: # foo 04: # 05: ################################################################################ 06: 07: FOO_VERSION = 1.0 08: FOO_SOURCE = foo-$(FOO_VERSION).tar.gz 09: FOO_SITE = http://www.foosoftware.org/download 10: FOO_LICENSE = GPLv3+ 11: FOO_LICENSE_FILES = COPYING 12: FOO_INSTALL_STAGING = YES 13: 14: FOO_DEPENDENCIES = host-meson host-pkgconf bar 15: 16: FOO_CONF_OPTS += \ 17: --prefix=/usr \ 18: --buildtype $(if $(BR2_ENABLE_DEBUG),debug,release) \ 19: --cross-file $(HOST_DIR)/etc/meson/cross-compilation.conf 20: 21: FOO_NINJA_OPTS = $(if $(VERBOSE),-v) 22: 23: ifeq ($(BR2_PACKAGE_BAZ),y) 24: FOO_CONF_OPTS += -Dbaz 25: endif 26: 27: define FOO_CONFIGURE_CMDS 28: rm -rf $(@D)/build 29: mkdir -p $(@D)/build 30: $(TARGET_MAKE_ENV) meson $(FOO_CONF_OPTS) $(@D) $(@D)/build 31: endef 32: 33: define FOO_BUILD_CMDS 34: $(TARGET_MAKE_ENV) ninja $(FOO_NINJA_OPTS) -C $(@D)/build 35: endef 36: 37: define FOO_INSTALL_TARGET_CMDS 38: $(TARGET_MAKE_ENV) DESTDIR=$(TARGET_DIR) ninja $(FOO_NINJA_OPTS) \ 39: -C $(@D)/build install 40: endef 41: 42: define FOO_INSTALL_STAGING_CMDS 43: $(TARGET_MAKE_ENV) DESTDIR=$(STAGING_DIR) ninja $(FOO_NINJA_OPTS) \ 44: -C $(@D)/build install 45: endef 46: 47: $(eval $(generic-package)) -------------------------------- The Makefile starts with the definition of the standard variables for package declaration (lines 7 to 11). As seen in line 47, it is based on the xref:generic-package-tutorial[+generic-package+ infrastructure]. So, it defines the variables required by this particular infrastructure, where Meson and its companion tool, Ninja, are invoked: * +FOO_CONFIGURE_CMDS+: the build directory required by Meson is created, and Meson is invoked to generate the Ninja build file. The options required to configure the cross-compilation of the package are passed via +FOO_CONF_OPTS+. * +FOO_BUILD_CMDS+: Ninja is invoked to perform the build. * +FOO_INSTALL_TARGET_CMDS+: Ninja is invoked to install the files generated during the build step in the target directory. * +FOO_INSTALL_STAGING_CMDS+: Ninja is invoked to install the files generated during the build step in the staging directory, as +FOO_INSTALL_STAGING+ is set to "YES". In order to have Meson available for the build, +FOO_DEPENDENCIES+ needs to contain +host-meson+. In the example, +host-pkgconf+ and +bar+ are also declared as dependencies because the Meson build file of +foo+ uses `pkg-config` to determine the compilation flags and libraries of package +bar+. If the "baz" package is selected, then support for the "baz" feature in "foo" is activated by adding +-Dbaz+ to +FOO_CONF_OPTS+, as specified in the +meson_options.txt+ file in "foo" source tree. To sum it up, to add a new meson-based package, the Makefile example can be copied verbatim then edited to replace all occurences of +FOO+ with the uppercase name of the new package and update the values of the standard variables.