mirror of
git://git.openembedded.org/meta-openembedded
synced 2026-01-01 13:58:06 +00:00
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:
parent
7edd553fbc
commit
6b1ba4543a
8
meta-oe/classes/capnproto.bbclass
Normal file
8
meta-oe/classes/capnproto.bbclass
Normal 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++ "
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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++"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user