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 <skandigr...@gmail.com>
---
 meta-oe/classes/capnproto.bbclass             |  8 ++++
 ...n-t-check-usr-bin-content-from-cmake.patch | 43 +++++++++++++++++++
 .../capnproto/capnproto_1.0.2.bb              |  3 +-
 3 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 meta-oe/classes/capnproto.bbclass
 create mode 100644 
meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch

diff --git a/meta-oe/classes/capnproto.bbclass 
b/meta-oe/classes/capnproto.bbclass
new file mode 100644
index 000000000..a698f41c9
--- /dev/null
+++ b/meta-oe/classes/capnproto.bbclass
@@ -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++ "
diff --git 
a/meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch
 
b/meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch
new file mode 100644
index 000000000..6447fadcf
--- /dev/null
+++ 
b/meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch
@@ -0,0 +1,43 @@
+From 43573472a62ff68ba6b1180d6551ef536471a99f Mon Sep 17 00:00:00 2001
+From: Gyorgy Sarvari <skandigr...@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 <skandigr...@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.
diff --git a/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb 
b/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb
index daeeb975f..6136ff20f 100644
--- a/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb
+++ b/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb
@@ -5,7 +5,8 @@ SECTION = "console/tools"
 LICENSE = "MIT"
 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"
 
 S = "${WORKDIR}/git/c++"
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#115238): 
https://lists.openembedded.org/g/openembedded-devel/message/115238
Mute This Topic: https://lists.openembedded.org/mt/110969312/21656
Group Owner: openembedded-devel+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to