diff mbox series

[meta-oe] capnproto: only export binaries for native build

Message ID 20250225133335.520207-1-skandigraun@gmail.com
State Accepted
Headers show
Series [meta-oe] capnproto: only export binaries for native build | expand

Commit Message

Gyorgy Sarvari Feb. 25, 2025, 1:33 p.m. UTC
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>
---
 ...n-t-check-usr-bin-content-from-cmake.patch | 43 ---------------
 ...xport-binaries-only-for-native-build.patch | 53 +++++++++++++++++++
 .../capnproto/capnproto_1.0.2.bb              |  2 +-
 3 files changed, 54 insertions(+), 44 deletions(-)
 delete mode 100644 meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch
 create mode 100644 meta-oe/recipes-devtools/capnproto/capnproto/0001-Export-binaries-only-for-native-build.patch
diff mbox series

Patch

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
deleted file mode 100644
index 6447fadcf9..0000000000
--- a/meta-oe/recipes-devtools/capnproto/capnproto/0001-Don-t-check-usr-bin-content-from-cmake.patch
+++ /dev/null
@@ -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.
diff --git a/meta-oe/recipes-devtools/capnproto/capnproto/0001-Export-binaries-only-for-native-build.patch b/meta-oe/recipes-devtools/capnproto/capnproto/0001-Export-binaries-only-for-native-build.patch
new file mode 100644
index 0000000000..7677d96b23
--- /dev/null
+++ b/meta-oe/recipes-devtools/capnproto/capnproto/0001-Export-binaries-only-for-native-build.patch
@@ -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.
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 6136ff20fb..77bde79217 100644
--- a/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb
+++ b/meta-oe/recipes-devtools/capnproto/capnproto_1.0.2.bb
@@ -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++"