| // -*- 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 = GPL-3.0+ |
| 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) -j$(PARALLEL_JOBS) |
| 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. |