mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-06-04 14:39:54 +00:00
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:
-43
@@ -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.
|
||||
+53
@@ -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++"
|
||||
|
||||
Reference in New Issue
Block a user