capnproto: only export binaries for native build

The base problem this is trying to solve: capnproto has two main
components: libraries that can be linked against, and binary files
that can generate c++ code from capnproto definitions. When cross-compiling
one needs to use the cross-compiled libraries, but with the native
definition-compilers.
When linking against capnproto from another recipe, cross-compilation
fails, because the cmake files generated by capnproto verify the
existence of binary files in $bindir. When using a cross-compiled
version of capnproto, these binary files do not exist in RECIPE_SYSROOT, so
the compilation fails.

The previous patch: the previous solution patched the CMakeLists.txt
file in a way that it didn't export nor install the generated binary files.
Accidentally this also happened with native build (and happened knowingly with
target builds).

The new patch: instead of not installing and not exporting the binaries,
just install them without exporting, when creating a target build.
During compilation check is CMAKE_CROSSCOMPILING is set (coming from
cmake.bbclass) - if it is set, only install the binaries, without
exporting. When it is not set, resort to the original behavior.

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-25 14:33:35 +01:00
committed by Khem Raj
parent 996dfcbdd7
commit e3c5b2dd0c
3 changed files with 54 additions and 44 deletions
@@ -1,43 +0,0 @@
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.
@@ -0,0 +1,53 @@
From e654a7015f5e8f20bf7681681cc2b80082303007 Mon Sep 17 00:00:00 2001
From: Gyorgy Sarvari <skandigraun@gmail.com>
Date: Tue, 25 Feb 2025 13:43:42 +0100
Subject: [PATCH] Export binaries only for native build
By default, the cmake configuratione exports all generated files,
so when using the generated cmake file with a find_package command,
it verifies that these files actually exist.
When using the cross-compiled version of capnproto, the generated
binaries are not available in RECIPE_SYSROOT (since they can be
used as RDEPENDS only, but not usable as DEPENDS), and due to
this the compilation fails.
To avoid this, check during the compilation of capnproto if it is
being cross-compiled, or not. If is it cross-compiled, then only
install the generated binary files in their final location, but
don't export them. When not cross-compiling, do the same, but also
export the files (which is the default behavior).
Upstream-Status: Inappropriate [oe specific: see above message]
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
c++/src/capnp/CMakeLists.txt | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/c++/src/capnp/CMakeLists.txt b/c++/src/capnp/CMakeLists.txt
index 9980fde6..8732db93 100644
--- a/src/capnp/CMakeLists.txt
+++ b/src/capnp/CMakeLists.txt
@@ -210,7 +210,20 @@ 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(NOT CMAKE_CROSSCOMPILING)
+ install(TARGETS capnp_tool capnpc_cpp capnpc_capnp ${INSTALL_TARGETS_DEFAULT_ARGS})
+ else()
+ # INSTALL_TARGETS_CROSS_COMPILED_BINARY_ARGS is identical to INSTALL_TARGETS_DEFAULT_ARGS,
+ # except that the installed files are not exported, so when the generated cmake file
+ # is used by a find_package command, it won't try to find these files.
+ set(INSTALL_TARGETS_CROSS_COMPILED_BINARY_ARGS
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ )
+
+ install(TARGETS capnp_tool capnpc_cpp capnpc_capnp ${INSTALL_TARGETS_CROSS_COMPILED_BINARY_ARGS})
+ endif()
if(WIN32)
# On Windows platforms symlinks are not guaranteed to support. Also different version of CMake handle create_symlink in a different way.
@@ -6,7 +6,7 @@ LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://../LICENSE;md5=a05663ae6cca874123bf667a60dca8c9"
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"
file://0001-Export-binaries-only-for-native-build.patch"
SRCREV = "1a0e12c0a3ba1f0dbbad45ddfef555166e0a14fc"
S = "${WORKDIR}/git/c++"