Porting packages to buildroot using the Zabbix example
- понедельник, 4 мая 2020 г. в 00:12:54
Originally, Buildroot offers a limited number of packages. It makes sense — there is everything you need, but any other packages can be added.
To add a package, create 2 description files, an optional checksum file, and add a link to the package in the general package list. There are hooks at different stages of the build. At the same time, Buildroot can recognize the needed type of packages:
All package types are well documented in the Buildroot guide. You can specify different options for getting package source — git, svn, local storage, and others. It's easy to get sources from GitHub. When porting the slim and GitHub packages, we will do so. There is a division into host packages (used only for building other packages that do not fall into the target file system) and packages that fall into the system being built. You can combine this functionality in one package.
Sometimes, you need to apply patches to the source packages. There are two ways to do this:
It's the second method that I'll use. The path to the global folder is set in the section Build options → global patch directories. You can set multiple directories. Note that to apply patches to the kernel, it's recommended to use the item Kernel → custom kernel patches. There, you can specify a list of patches as an URL or path to a file/catalog.
You can apply a patch to a single version of the package, or all versions. The difference in the path to the patch:
The important point is to describe the package dependency. It's described in two files: Config.in (Config.in. host for the hosting package) and ${packagename}.mk.
File Config.in (like Config.in.host) adds the package to the KConfig menu. You can set two types of dependencies: depends on and select.
Depends on — displays the package in the menu only if the specified dependencies are already enabled.
Select works the other way around: if our package is selected, enable the dependency.
Both these dependencies work to generate the build configuration (the .config file in the Buildroot root).
The dependency in the ${packagename}.mk file works differently. During the build stage, Buildroot generates a list of packages to build and install in alphabetical order. And it may happen that, to build a package Apackage, you need a Bpackage package, which will be built, but too late. An error occurs that stops the build.
So, to the file Apackage.mk you need to add this line:
APACKAGE_DEPENDENCIES = BPACKAGE
When the Buildroot reaches the Apackage build and sees the dependency, it'll first build the Bpackage package, and then return to Apackage.
When writing a make-file with the package build/install rules, you can use variables. The following variables helped me:
If you run make help in the Buildroot root, you can learn about additional commands:
Package-specific:
<pkg> - Build and install <pkg> and all its dependencies
<pkg>-source - Only download the source files for <pkg>
<pkg>-extract - Extract <pkg> sources
<pkg>-patch - Apply patches to <pkg>
<pkg>-depends - Build <pkg>'s dependencies
<pkg>-configure - Build <pkg> up to the configure step
<pkg>-build - Build <pkg> up to the build step
<pkg>-show-info - generate info about <pkg>, as a JSON blurb
<pkg>-show-depends - List packages on which <pkg> depends
<pkg>-show-rdepends - List packages which have <pkg> as a dependency
<pkg>-show-recursive-depends - Recursively list packages on which <pkg> depends
<pkg>-show-recursive-rdepends - Recursively list packages which have <pkg> as a dependency
<pkg>-graph-depends - Generate a graph of <pkg>'s dependencies
<pkg>-graph-rdepends - Generate a graph of <pkg>'s reverse dependencies
<pkg>-dirclean - Remove <pkg> build directory
<pkg>-reconfigure - Restart the build from the configure step
<pkg>-rebuild - Restart the build from the build step
You can add your hooks at different stages of the package build (from downloading to installation). For a complete list, see the Buildroot documentation.
For example, after installing the demopackage package, I want to run a command that copies the README from the build directory to target-fs. To do this, I make changes to demopackage.mk:
vim package/demopackage/demopackage.mk
First, I’ll set the section with the necessary commands
define DEMOPACKAGE_COPY_README
cp $(@D)/readme.txt $(TARGET_DIR)/var/demopackage/
endef
And now, I'll add these commands to execute in the post-install-target hook, which are executed after installing the package in target-fs:
DEMOPACKAGE_POST_INSTALL_TARGET_HOOKS += DEMOPACKAGE_COPY_README
This example is very artificial. I recommend paying attention to the section of the article, where I ported the Zabbix package, there is a real application.
For convenience, I keep all my developments in the overlay, which is easy to connect to the Buildroot. Read more here
Let's look at the file structure in the overlay that is necessary for adding packages (only the necessary ones are shown):
../overlay/
├── package
│ ├── rodos
│ │ ├── 0001-MAKEFILE-FIX.patch
│ │ ├── Config.in
│ │ └── rodos.mk
│ └── zabbix
│ ├── Config.in
│ ├── zabbix-agent.service
│ ├── zabbix.hash
│ ├── zabbix.mk
│ └── zabbix-server.service
├── external.mk
├── Config.in
Package — the catalog with the packages themselves. There are 2 required files inside — Config.in and ${packagename}.mk. The first is responsible for displaying the KConfig package when configuring the Board; the second contains commands for building the package. It's also helpful to have a ${packagename}.hash file, which contains the hash of the archive with the package sources.
The practical part will start with a relatively simple package for the RODOS-5 thermal sensor. The source code is stored on the manufacturer's website as an archive.
To start, I will create the necessary files:
../overlay/
├── package
│ ├── rodos
│ │ ├── 0001-MAKEFILE-FIX.patch
│ │ ├── Config.in
│ │ └── rodos.mk
Config.in — the file from which the menu will be built.
[alexey@comp monitor]$ cat overlay/package/rodos/Config.in
config BR2_PACKAGE_RODOS
bool "rodos"
select BR2_PACKAGE_LIBUSB
help
rodos 5-6 usb termometer software
################################################################################
#
# rodos 5 6
#
################################################################################
RODOS_SOURCE = RODOS5_6.tar.gz
RODOS_SITE = https://silines.ru/software/RODOS/RODOS-5_6
RODOS_DEPENDENCIES += libusb host-libusb
define RODOS_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/RODOS5_6 $(TARGET_DIR)/usr/bin/RODOS5_6
endef
define RODOS_BUILD_CMDS
$(TARGET_MAKE_ENV) $(MAKE) $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS)" -C $(@D)
endef
$(eval $(generic-package))
IMPORTANT The names of the set variables must match the package name. In this case, RODOS.
This package is simple; let's look at the structure:
The last line, \$(eval $(generic-package)), sets the package type. In this case, we'll have to set the commands for building and installing the package ourselves. In the case of a cmake package (for example), these commands would follow the rules of the cmake file in the package.
RODOS_SOURCE — the name of the archive that will be downloaded. If you don't specify it, Buildroot will generate the archive name for downloading by its own rules.
RODOS_SITE — the address of the source with source codes. In this case, it's the website address, but it can also be the address of ftp, git, gitlab, svn, and others.
RODOS_DEPENDENCIES — the dependencies required for building the package.
define RODOS_INSTALL_TARGET_CMDS — the section with commands that are used to install the collected files in target-fs.
define RODOS_BUILD_CMDS — commands with package compilation rules. It's important to pay attention to the use of variables.
Special attention should be paid to the 0001-MAKEFILE-FIX.patch file. As previously mentioned, Buildroot can apply patches to packages. In this case, I put the patch directly in the package directory. Between unpacking and building a package, the system applies patches in alphabetical order.
The ZABBIX package turned out to be more difficult to port. The package is complex and requires dependency. Below is the version that works. This version not in builroot master branch, but already submitted. It's mandatory to set zabbix-agent; zabbix-server if necessary.
So first, I created the package structure:
tree overlay/package/zabbix/
overlay/package/zabbix/
├── Config.in
├── zabbix-agent.service
├── zabbix.hash
├── zabbix.mk
└── zabbix-server.service
To Config.in and make-file files with the build rules were added the following files:
zabbix.hash This is the file with the checksum of the source archive
cat overlay/package/zabbix/zabbix.hash
# Locally computed
sha256 22bb28e667424ad4688f47732853f4241df0e78a7607727b043d704ba726ae0e zabbix-4.4.6.tar.gz
sha256 a823e00bc7f0844874f90fee97136f178e7debc76bace5f09e15ee8ed55f04c3 README
The first line indicates that the checksums were not taken from the manufacturer, but calculated independently.
The next 2 lines give the checksums themselves: for the source file and the license file (located inside the source files). This is the requirement of Buildroot itself.
zabbix-agent.service, zabbix-server.service — systemd- the units for starting the agent and server.
Let’s look inside the Config.in:
cat overlay/package/zabbix/Сonfig.in
config BR2_PACKAGE_ZABBIX
bool "zabbix"
# Zabbix requires glibc, musl; any other alternative won't work
# If the condition is not met, the package won't be shown in the Board settings menu
depends on BR2_TOOLCHAIN_USES_GLIBC=y || BR2_TOOLCHAIN_EXTERNAL_GLIBC=y || BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
# Adds the pcre package to the system
select BR2_PACKAGE_PCRE
help
Zabbix is an enterprise-class open source distributed
monitoring solution. Zabbix is free of cost. Zabbix
is written and distributed under the GPL General Public
License version 2.
# if glibc is not used, a warning about its necessity is displayed
if (!BR2_TOOLCHAIN_USES_GLIBC && !BR2_TOOLCHAIN_EXTERNAL_GLIBC && !BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC)
comment "zabbix need glibc"
endif
# If the zabbix package is selected for the build
if BR2_PACKAGE_ZABBIX
# Similar to glibc, but only for zabbix-server
if (!BR2_PACKAGE_POSTGRESQL && !BR2_PACKAGE_MYSQL)
comment "zabbix server needs postgresql or mysql support"
endif
config BR2_PACKAGE_ZABBIX_SERVER
bool "zabbix server"
# this way, you can select one of the dependencies
depends on BR2_PACKAGE_POSTGRESQL || BR2_PACKAGE_MYSQL
select BR2_PACKAGE_ZLIB
select BR2_PACKAGE_LIBEVENT
# If the server is selected for the build
if BR2_PACKAGE_ZABBIX_SERVER
# This way, you can select one of the options
choice
prompt "server database backend"
config BR2_PACKAGE_ZABBIX_SERVER_MYSQL
bool "mysql"
depends on BR2_PACKAGE_MYSQL
config BR2_PACKAGE_ZABBIX_SERVER_POSTGRESQL
bool "postgresql"
depends on BR2_PACKAGE_POSTGRESQL
endchoice
# This is optional. After this, you can use the variable
BR2_PACKAGE_ZABBIX_SERVER_COPY_DUMPS
# during the building process. For example, you can call a hook at a certain value of this variable.
if BR2_PACKAGE_ZABBIX_SERVER_POSTGRESQL || BR2_PACKAGE_ZABBIX_SERVER_MYSQL
config BR2_PACKAGE_ZABBIX_SERVER_COPY_DUMPS
bool "install sql dumps"
help
Copy initial database dumps to /usr/zabbix/
endif
# This part is the requirements for the server's web interface.
if (!BR2_PACKAGE_PHP || (!BR2_PACKAGE_PHP_EXT_MYSQLI && !BR2_PACKAGE_PHP_EXT_PGSQL) || \
!BR2_PACKAGE_PHP_EXT_MBSTRING || !BR2_PACKAGE_PHP_EXT_BCMATH || \
!BR2_PACKAGE_PHP_EXT_SOCKETS || !BR2_PACKAGE_PHP_EXT_GD || \
!BR2_PACKAGE_PHP_EXT_LIBXML2 || !BR2_PACKAGE_PHP_EXT_CTYPE || \
!BR2_PACKAGE_PHP_EXT_SESSION || !BR2_PACKAGE_PHP_EXT_XMLREADER || \
!BR2_PACKAGE_PHP_EXT_XMLWRITER )
comment "zabbix-frontend need php with extensions(bc, sockets, "
comment "mbstring, gd, libxml2, ctype, session, xmlreader, xmlwriter, mysql or postgresql"
endif
choice
prompt "server ssl/tls backend"
config BR2_PACKAGE_ZABBIX_SERVER_NOTLS
bool "none"
config BR2_PACKAGE_ZABBIX_SERVER_OPENSSL
bool "openssl"
depends on BR2_PACKAGE_OPENSSL
config BR2_PACKAGE_ZABBIX_SERVER_GNUTLS
bool "gnutls"
depends on BR2_PACKAGE_GNUTLS
endchoice
# also optional. These variables will also be used during the build.
# allows you to change the list of dependencies, build rules, call hooks, and redefine them.
# commands for different build stages.
config BR2_PACKAGE_ZABBIX_SERVER_OPENIPMI
bool "openipmi support"
select BR2_PACKAGE_OPENIPMI
config BR2_PACKAGE_ZABBIX_SERVER_LIBSSH2
bool "libssh2 support"
select BR2_PACKAGE_LIBSSH2
config BR2_PACKAGE_ZABBIX_SERVER_LDAP
bool "openldap support"
select BR2_PACKAGE_OPENLDAP
if (!BR2_USE_MMU)
comment "netsnmp support need MMU"
endif
config BR2_PACKAGE_ZABBIX_SERVER_NETSNMP
bool "net-snmp support"
depends on BR2_USE_MMU # netsnmp
select BR2_PACKAGE_NETSNMP
config BR2_PACKAGE_ZABBIX_SERVER_LIBCURL
bool "libcurl support"
select BR2_PACKAGE_LIBCURL
config BR2_PACKAGE_ZABBIX_SERVER_LIBXML2
bool "libxml2 support"
select BR2_PACKAGE_LIBXML2
# Copying files for the web interface. Many dependencies with complex rules. depends on adds a load on the developer since you need to manually set all the necessary Board settings. At the same time, it guarantees the accuracy of settings and the presence of these packages in the built system.
config BR2_PACKAGE_ZABBIX_SERVER_COPY_FRONTEND
bool "copy php-frontend to target"
depends on BR2_PACKAGE_PHP
depends on BR2_PACKAGE_PHP_EXT_MYSQLI || BR2_PACKAGE_PHP_EXT_PGSQL
depends on BR2_PACKAGE_PHP_EXT_BCMATH
depends on BR2_PACKAGE_PHP_EXT_SOCKETS
depends on BR2_PACKAGE_PHP_EXT_MBSTRING
depends on BR2_PACKAGE_PHP_EXT_GD
depends on BR2_PACKAGE_PHP_EXT_LIBXML2
depends on BR2_PACKAGE_PHP_EXT_CTYPE
depends on BR2_PACKAGE_PHP_EXT_SESSION
depends on BR2_PACKAGE_PHP_EXT_XMLREADER
depends on BR2_PACKAGE_PHP_EXT_XMLWRITER
help
copy web-frontend to /usr/zabbix/php-frontend
endif
endif
How it looks in the menu:
[*] zabbix
[*] zabbix server
server database backend (postgresql) --->
[ ] install sql dumps (NEW)
*** zabbix-frontend need php with extensions(bc, sockets, ***
*** mbstring, gd, libxml2, ctype, session, xmlreader, xmlwriter, mysql or postgresql ***
server ssl/tls backend (none) --->
[ ] openipmi support (NEW)
[ ] libssh2 support (NEW)
[ ] openldap support (NEW)
[ ] net-snmp support (NEW)
[ ] libcurl support (NEW)
[ ] libxml2 support (NEW)
And the choice of database (within the zabbix server database backend):
( ) Use mysql support
(X) Use postgresql support
Then, you'll need an explanation of what, how, and why I did it.
zabbix — installing the Zabbix package. Initially, the agent is set, and if necessary, the server is set.
zabbix server — installing the Zabbix server — an important point. The server requires a database (postgresql or mysql), but it may be on a different host. However, you'll need the package to build it. TK is a mandatory requirement; I added the option depends on.
install sql dumps — this option allows you to copy the sql dumps needed to create a Zabbix database.
ZABBIX can support various features, such as working with ldap, openipmi, and so on. For all this, it needs header files and/or a library of corresponding packages — openldap, openipmi.
Make-file with build instructions (note that the variable names start with the package name and match the variable names I used above):
################################################################################
#
#zabbix
#
################################################################################
# Package version. This is important because it's used to build the file name for downloading
# Learn more here https://buildroot.org/downloads/manual/manual.html#generic-package-reference
ZABBIX_VERSION = 4.4.6
# Source where the source codes will be downloaded from
ZABBIX_SITE = https://sourceforge.net/projects/zabbix/files
# License type and file with it
ZABBIX_LICENSE = GPL-2.0
ZABBIX_LICENSE_FILES = README
# Dependencies
ZABBIX_DEPENDENCIES = pcre
# List of options for configuration and build.
ZABBIX_CONF_OPTS = --with-libpcre=$(STAGING_DIR)/usr/bin/ \
--enable-agent
# An interesting point is an example of using hooks.
# To change the configuration file, I need to run sed after installing the files.
# First, you need to declare a set of commands, then add their call to hooks.
# I'll declare the commands first. Note that the sed call is from the toolchain, not the system.
define ZABBIX_CLIENT_CHANGE_PIDFILE_LOCATION
$(SED) 's%\#\ PidFile=/tmp/zabbix_agentd.pid%PidFile=/run/zabbix/zabbix_agentd.pid%g' $(TARGET_DIR)/etc/zabbix_agentd.conf
endef
# And now I'll add this set of commands to the hook that is executed after installation in the target
ZABBIX_POST_INSTALL_TARGET_HOOKS += ZABBIX_CLIENT_CHANGE_PIDFILE_LOCATION
# Canonical method for installing systemd units and autorun them in multi-user.targer
# To add UNIT, just add the file name to the ZABBIX_SYSTEMD_UNITS variable
# For example, ZABBIX_SYSTEMD_UNITS += zabbix-agent.service
# First, I'll add the file to the list
ZABBIX_SYSTEMD_UNITS += zabbix-agent.service
# Then I'll install them.
define ZABBIX_INSTALL_INIT_SYSTEMD
$(foreach unit,$(ZABBIX_SYSTEMD_UNITS),\
$(INSTALL) -D -m 0644 $(ZABBIX_PKGDIR)/$(unit) $(TARGET_DIR)/usr/lib/systemd/system/$(unit) && \
mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants && \
ln -fs -r $(TARGET_DIR)/usr/lib/systemd/system/$(unit) $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/$(unit)
)
endef
# This is the correct way to add a user to the system
define ZABBIX_USERS
zabbix -1 zabbix -1 !- /var/lib/zabbix - zabbix zabbix user
endef
# An example of using a variable from Config.in. If the server is selected for installation, the following steps are performed
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER),y)
# Adding another systemd unit-file
ZABBIX_SYSTEMD_UNITS += zabbix-server.service
# Adding build options to existing ones
ZABBIX_CONF_OPTS += --enable-server \
--with-libevent \
--with-libpthread=$(STAGING_DIR)/usr \
--with-zlib=$(STAGING_DIR)/usr
# Also, add the dependencies
ZABBIX_DEPENDENCIES += libevent zlib
# Using hooks again - adding another set of commands to the list
ZABBIX_POST_INSTALL_TARGET_HOOKS += ZABBIX_SERVER_CHANGE_PIDFILE_LOCATION
# Support for one of the options, particularly openipmi.
# I also check the value of the variable, add build options and dependencies, and call hooks
# Need openipmi in staging dir. Patch submitted in 2019.12.16
# Before this patch is enabled, use this crutch
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_OPENIPMI),y)
ZABBIX_CONF_OPTS += --with-openipmi=$(STAGING_DIR)/usr
ZABBIX_DEPENDENCIES += openipmi
ZABBIX_PRE_CONFIGURE_HOOKS += BR2_PACKAGE_ZABBIX_SERVER_OPENIPMI_FIX_LIBS
define BR2_PACKAGE_ZABBIX_SERVER_OPENIPMI_FIX_LIBS
if [ ! -f $(STAGING_DIR)/usr/lib/libOpenIPMI.so ]; then \
cp -rf $(TARGET_DIR)/usr/lib/libOpenIPMI* $(STAGING_DIR)/usr/lib/ ;\
cp -rf $(TARGET_DIR)/usr/include/OpenIPMI $(STAGING_DIR)/usr/include/ ;\
fi
endef
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_LIBCURL),y)
ZABBIX_CONF_OPTS += --with-libcurl=$(STAGING_DIR)/usr/bin/curl-config
ZABBIX_DEPENDENCIES += libcurl
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_LIBXML2),y)
ZABBIX_CONF_OPTS += --with-libxml2=$(STAGING_DIR)/usr/bin/xml2-config
ZABBIX_DEPENDENCIES += libxml2
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_NETSNMP),y)
ZABBIX_CONF_OPTS += --with-net-snmp=$(STAGING_DIR)/usr/bin/net-snmp-config
ZABBIX_DEPENDENCIES += netsnmp
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_LDAP),y)
ZABBIX_CONF_OPTS += --with-ldap=$(STAGING_DIR)/usr
ZABBIX_DEPENDENCIES += openldap
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_LIBSSH2),y)
ZABBIX_CONF_OPTS += --with-ssh2=$(STAGING_DIR)/usr
ZABBIX_DEPENDENCIES += libssh2
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_OPENSSL),y)
ZABBIX_CONF_OPTS += --with-openssl=$(STAGING_DIR)/usr
ZABBIX_DEPENDENCIES += openssl
else ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_GNUTLS),y)
ZABBIX_CONF_OPTS += --with-gnutls=$(STAGING_DIR)/usr
ZABBIX_DEPENDENCIES += gnutls
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_COPY_FRONTEND),y)
ZABBIX_POST_INSTALL_TARGET_HOOKS += ZABBIX_SERVER_COPY_FRONTEND
define ZABBIX_SERVER_COPY_FRONTEND
mkdir -p $(TARGET_DIR)/usr/zabbix/php-frontend/
cp -r $(@D)/frontends/php/* $(TARGET_DIR)/usr/zabbix/php-frontend/
endef
endif
define ZABBIX_SERVER_CHANGE_PIDFILE_LOCATION
$(SED) 's%\#\ PidFile=/tmp/zabbix_server.pid%PidFile=/run/zabbix/zabbix_server.pid%g' $(TARGET_DIR)/etc/zabbix_server.conf
endef
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_MYSQL),y)
ZABBIX_DEPENDENCIES += mysql
ZABBIX_CONF_OPTS += --with-mysql=$(STAGING_DIR)/usr/bin/mysql_config
# Need package/mariadb/0003-add-sysroot-path-to-mariadb_config.patch by Ryan Coe
# While this patch is not included, use this crutch
ZABBIX_PRE_CONFIGURE_HOOKS += ZABBIX_DISABLE_MARIADB_CONFIG
ZABBIX_POST_CONFIGURE_HOOKS += ZABBIX_ENABLE_MARIADB_CONFIG
define ZABBIX_DISABLE_MARIADB_CONFIG
if [ -f "$(STAGING_DIR)/usr/bin/mariadb_config" ]; then \
mv $(STAGING_DIR)/usr/bin/mariadb_config $(STAGING_DIR)/usr/bin/mariadb_config_save; \
fi
endef
define ZABBIX_ENABLE_MARIADB_CONFIG
if [ -f "$(STAGING_DIR)/usr/bin/mariadb_confi_save" ]; then \
mv $(STAGING_DIR)/usr/bin/mariadb_config_save $(STAGING_DIR)/usr/bin/mariadb_config; \
fi
endef
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_COPY_DUMPS),y)
ZABBIX_POST_INSTALL_TARGET_HOOKS += ZABBIX_SERVER_PREPARE_MYSQL
endif
define ZABBIX_SERVER_PREPARE_MYSQL
mkdir -p $(TARGET_DIR)/usr/zabbix/mysql_schema/
cp -r $(@D) $(@D)/database/mysql/*\.sql $(TARGET_DIR)/usr/zabbix/mysql_schema/
endef
endif
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_POSTGRESQL),y)
ZABBIX_DEPENDENCIES += postgresql
ZABBIX_CONF_OPTS += --with-postgresql=$(STAGING_DIR)/usr/bin/pg_config
define ZABBIX_SERVER_PREPARE_POSTGRESQL
mkdir -p $(TARGET_DIR)/usr/zabbix/postgresql_schema
cp -r $(@D)/database/postgresql/*\.sql $(TARGET_DIR)/usr/zabbix/postgresql_schema/
endef
ifeq ($(BR2_PACKAGE_ZABBIX_SERVER_COPY_DUMPS),y)
ZABBIX_POST_INSTALL_TARGET_HOOKS += ZABBIX_SERVER_PREPARE_POSTGRESQL
endif
endif
endif
# I set the package type. In this case, autotools will be used.
$(eval $(autotools-package))
When installing the package, zabbix-agent and its dependencies will also be installed. The location of its pid-file will be changed, and the systemd UNIT file will be installed with its autorun in multi-user.target.
Optionally, you can also install zabbix-server. But then DBMS will be selected for installation, and the dump files with initial data (optional), as well as the web-frontend files (also optional), will be copied to the target system.
I specifically didn't add a web server installation. First, it can be located on another computer. Secondly, there are a lot of options for a web server; if you'll need it — you'll install the right one with the necessary php modules.
As you can see from the text above, it's quite possible to port packages to the Buildroot by yourself. There are powerful mechanisms that automate the build. At the same time, it's possible to intervene in the build process at any time and change the necessary moments.