capnproto: remove binaries from target-build, add bbclass

When linking to capnproto from another project, cmake fails to
find this package with the following error:

| CMake Error at ${RECIPE_SYSROOT}/usr/lib/cmake/CapnProto/CapnProtoTargets.cmake:176 (message):
|   The imported target "CapnProto::capnp_tool" references the file
|
|      "${RECIPE_SYSROOT}/usr/bin/capnp"
|
|   but this file does not exist.  Possible reasons include:

To solve this, this change includes the following:

1. Add a patch that removes the files installed (and exported) in
${bindir} from the target build. The CMake file originally verified
that these files exist when another recipe tried to use it, however
the ${RECIPE_SYSROOT} does not contain the binaries in ${bindir},
so it failed quick in the do_configure step. (This alone is enough
to link against the cross-compiled libraries of capnproto successfully,
but code-generation from capnproto definition fails)

2. Add a new bbclass for capnproto. To cross-compile an application
that uses capnproto, the application needs to be linked against the
cross-compiled version of the libraries, however the native version
of the binaries need to be used to generate C++ code from the
capnproto definitions. This class sets the correct CMake arguments, to
use the capnproto binaries from the native package, instead of looking
for the non-existent cross-compiled binaries. (These variables can
be found in ${libdir}/cmake/CapnProto/CapnProtoConfig.cmake file)

Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Gyorgy Sarvari 2025-02-03 13:10:23 +01:00 committed by Khem Raj
parent 7edd553fbc
commit 6b1ba4543a
No known key found for this signature in database
GPG Key ID: BB053355919D3314
3 changed files with 53 additions and 1 deletions

View File

@ -0,0 +1,8 @@
# Inherit this class in your recipe to compile against
# Cap'N Proto (capnproto) with CMake
DEPENDS:append = " capnproto-native "
DEPENDS:append:class-target = " capnproto "
EXTRA_OECMAKE:append:class-target = " -DCAPNP_EXECUTABLE=${RECIPE_SYSROOT_NATIVE}${bindir}/capnp \
-DCAPNPC_CXX_EXECUTABLE=${RECIPE_SYSROOT_NATIVE}${bindir}/capnpc-c++ "

View File

@ -0,0 +1,43 @@
From 43573472a62ff68ba6b1180d6551ef536471a99f Mon Sep 17 00:00:00 2001
From: Gyorgy Sarvari <skandigraun@gmail.com>
Date: Mon, 3 Feb 2025 11:52:01 +0100
Subject: [PATCH] Don't install files in bindir
This patch prevents the generated binary executables from being
installed into the /usr/bin folder.
By default, cmake installs these binaries into the /usr/bin folder,
(e.g. binaries used to generate C++ source from the capnproto definition
files) however with Yocto, when using the cross-compiled version of this
application, the /usr/bin folder is not populated in the sysroot.
The generated cmake file however tries to verify that these binaries
exist, and since it cannot find them, it fails the build.
But even in case these files would exist, they are not usable on the build
machine, as these are cross-compiled for the target machine. When another
recipe it built against the capnproto cmake package, the application can
link against the cross-compiled libraries as expected, but for code
generation the capnproto-native package's binaries need to be used.
This patch is only applicable on the cross-compiled version of capnproto.
Upstream-Status: Inappropriate [oe specific: see above message]
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
c++/src/capnp/CMakeLists.txt | 2 --
1 file changed, 2 deletions(-)
diff --git a/c++/src/capnp/CMakeLists.txt b/c++/src/capnp/CMakeLists.txt
index 9980fde6..101a7091 100644
--- a/src/capnp/CMakeLists.txt
+++ b/src/capnp/CMakeLists.txt
@@ -210,8 +210,6 @@ if(NOT CAPNP_LITE)
target_link_libraries(capnpc_capnp capnp kj)
set_target_properties(capnpc_capnp PROPERTIES OUTPUT_NAME capnpc-capnp)
- install(TARGETS capnp_tool capnpc_cpp capnpc_capnp ${INSTALL_TARGETS_DEFAULT_ARGS})
-
if(WIN32)
# On Windows platforms symlinks are not guaranteed to support. Also different version of CMake handle create_symlink in a different way.
# The most portable way in this case just copy the file.

View File

@ -5,7 +5,8 @@ SECTION = "console/tools"
LICENSE = "MIT" LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://../LICENSE;md5=a05663ae6cca874123bf667a60dca8c9" LIC_FILES_CHKSUM = "file://../LICENSE;md5=a05663ae6cca874123bf667a60dca8c9"
SRC_URI = "git://github.com/sandstorm-io/capnproto.git;branch=release-${PV};protocol=https" SRC_URI = "git://github.com/sandstorm-io/capnproto.git;branch=release-${PV};protocol=https \
file://0001-Don-t-check-usr-bin-content-from-cmake.patch"
SRCREV = "1a0e12c0a3ba1f0dbbad45ddfef555166e0a14fc" SRCREV = "1a0e12c0a3ba1f0dbbad45ddfef555166e0a14fc"
S = "${WORKDIR}/git/c++" S = "${WORKDIR}/git/c++"