Search code examples
cmakemariadbyocto

Build libmariadb with Yocto


I am trying to make a recipe for a C++ app that uses libmariadb. While developing I was using vcpkg but now I want to use Yocto.

Here is the application_1.0.0.bb file:

# Metadata
SUMMARY = "Customer API Backend"
DESCRIPTION = "Customer API in C++ using gRPC"

# License is closed, no checksum to avoid warnings
LICENSE = "CLOSED"
LIC_FILE_CHKSUM = ""

DEPENDS = "protobuf protobuf-c protobuf-native grpc grpc-native openssl mariadb poco"

SRCREV = "${AUTOREV}"
SRC_URI = "git://git@gitlab.com/software/projects/embedded/application.git;protocol=ssh;branch=master;"

S = "${WORKDIR}/git"

inherit pkgconfig cmake

Here is the CMake part that poses problem with Yocto:

find_package(unofficial-libmariadb CONFIG REQUIRED)
find_package(Poco REQUIRED COMPONENTS Data DataMySQL)
target_link_libraries(database_api
    PRIVATE
        unofficial::libmariadb
        Poco::DataMySQL
)

I get this error message during the configure step (CMake):

CMake Error at src/libraries/external_interfaces/database_api/CMakeLists.txt:20 (find_package):
  Could not find a package configuration file probided by
  "unofficial-libmariadb" with any of the following names:

    unofficial-libmariadbConfig.cmake
    unofficial-libmariadb-config.cmake

  Add the installation prefix of "unofficial-libmariadb" to CMAKE_PREFIX_PATH
  or set "unofficial-libmariadb_DIR" to a directory containing one of the
  above files. If "unofficial-libmariadb" provides a separate development
  package or SDK, be sure it has been installed.

I tried adding mariadb-native to the DEPENDS on the bitbake recipe but then I get this error messagewhen configuring mariadb-native`:

CMake Error at /home/oe-core/build/tmp/work/x86_64-linux/mariadb-native/10.7.5-r0/recipe-sysroot-native/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
    Could NOT find GnuTLS (missing: GNUTLS_LIBRARY GNUTLS_INCLUDE_DIR)
    (Required is at least version "3.3.24")
Call Stack (most recent call first):
(...)
-- Configuring incomplete, errors occurred!

Solution

  • Ok I figured it out by using more recent versions of the mariadb recipes + vcpkg mariadb port patches:

    1. For the mariadb-native build: Add a mariadb-native_%.bbappend in a recipes-dbs/mysql/ folder in your layer:
    DEPENDS:append = " gnutls-native fmt-native"
    

    Alternative is to have the more recent mariadb-native_%.bb recipe as it is already included. If, like me, you have 10.7.4 or something, the bbappend is required.

    1. For the unofficial-mariadb target: Using Yocto's devtool on mariadb recipe, I just reproduced the patches that vcpkg port of libmariadb has (found here: https://github.com/microsoft/vcpkg/tree/master/ports/libmariadb). The one that matters is the modification to libmariadb/CMakeLists.txt (but from mariadb recipe this is libmariadb/libmariadb/CMakeLists.txt since this is a higher repo layer). This patch export unofficial-libmariadb and also uses the unofficial:: namespace. This makes my project compatible.