Message ID | 20220408073004.20207-1-stefan.herbrechtsmeier-oss@weidmueller.com |
---|---|
State | New |
Headers | show |
Series | [meta-oe,v2,1/2] grpc: add cmake support for target | expand |
Hi Stefan, On Fri, 8 Apr 2022 at 14:47, Stefan Herbrechtsmeier <stefan.herbrechtsmeier-oss@weidmueller.com> wrote: > > Hi Clement, > > Am 08.04.2022 um 14:25 schrieb Clément Péron: > > Hi Stefan, > > > > On Fri, 8 Apr 2022 at 09:30, Stefan Herbrechtsmeier > > <stefan.herbrechtsmeier-oss@weidmueller.com> wrote: > >> > >> From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> > >> > >> The CMake gRPC config checks for binaries and fails if a binary (plugin) > >> is missing. Fix the problem in the code and add the CMake gRPC config > >> back to the target package. > > > > Thanks for your patch, I'm still using gRPC 1.35 + your previous similar patch. > > I'm trying to bump to gRPC 1.45.1 + these patches. > > > > My recipe use CMake and depends on grpc and grpc-native: > > PACKAGECONFIG[grpc] = "-DCONFIG_GRPC=ON,-DCONFIG_GRPC=OFF,grpc grpc-native" > > > > But unfortunately CMake doesn't find the grpc_cpp_plugin. > > This is the correct behavior of my patch because the grpc_cpp_plugin > from the cross build isn't usable during cross build. You need the > grpc_cpp_plugin from the host and therefore have to search the > grpc_cpp_plugin by yourself during cross compile [1]. > > My first patch was rejected and therefore I create a minimal patch which > only make the CMake gRPC config usable. > > > > > | -- Using gRPC 1.45.1 > > .... > > | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): > > | Error evaluating generator expression: > > | > > | $<TARGET_FILE:gRPC::grpc_cpp_plugin> > > | > > | No target "gRPC::grpc_cpp_plugin" > > | > > | > > | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): > > | Error evaluating generator expression: > > | > > | $<TARGET_FILE:gRPC::grpc_cpp_plugin> > > | > > | No target "gRPC::grpc_cpp_plugin" > > | > > | > > | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): > > | Error evaluating generator expression: > > | > > | $<TARGET_FILE:gRPC::grpc_cpp_plugin> > > | > > | No target "gRPC::grpc_cpp_plugin" > > > > Here is my CMake source file: > > > > # Find Protobuf installation Yocto SDK doensn't support protobuf-config.cmake > > # for the moment > > set(protobuf_MODULE_COMPATIBLE TRUE) > > find_package(Protobuf REQUIRED) > > message(STATUS "Using protobuf ${Protobuf_VERSION}") > > set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) > > > > # Find gRPC installation Looks for gRPCConfig.cmake file installed by gRPC's > > # cmake installation. > > find_package(gRPC CONFIG REQUIRED) > > message(STATUS "Using gRPC ${gRPC_VERSION}") > > set(_REFLECTION gRPC::grpc++_reflection) > > set(_GRPC_GRPCPP gRPC::grpc++) > > > > # Get full path of protobuf/gRPC compiler > > set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>) > > set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) > > You have to search the binaries if you cross compile [1]: > > if(CMAKE_CROSSCOMPILING) > find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) > else() > set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) > endif() Thanks this fix my issue Tested-by: Clément Péron <peron.clem@gmail.com> > > > > > Do you have an example of how you look for gRPC in your recipe? > > This isn't possible because you use a target and not a variable. Maybe a dumb question but how protobuf-compiler handle this? Thanks, Clement > > [1] https://github.com/grpc/grpc/blob/master/examples/cpp/cmake/common.cmake > > Regards > Stefan
Hi Clement, Am 08.04.2022 um 21:12 schrieb Clément Péron: > Hi Stefan, > > On Fri, 8 Apr 2022 at 14:47, Stefan Herbrechtsmeier > <stefan.herbrechtsmeier-oss@weidmueller.com> wrote: >> >> Hi Clement, >> >> Am 08.04.2022 um 14:25 schrieb Clément Péron: >>> Hi Stefan, >>> >>> On Fri, 8 Apr 2022 at 09:30, Stefan Herbrechtsmeier >>> <stefan.herbrechtsmeier-oss@weidmueller.com> wrote: >>>> >>>> From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> >>>> >>>> The CMake gRPC config checks for binaries and fails if a binary (plugin) >>>> is missing. Fix the problem in the code and add the CMake gRPC config >>>> back to the target package. >>> >>> Thanks for your patch, I'm still using gRPC 1.35 + your previous similar patch. >>> I'm trying to bump to gRPC 1.45.1 + these patches. >>> >>> My recipe use CMake and depends on grpc and grpc-native: >>> PACKAGECONFIG[grpc] = "-DCONFIG_GRPC=ON,-DCONFIG_GRPC=OFF,grpc grpc-native" >>> >>> But unfortunately CMake doesn't find the grpc_cpp_plugin. >> >> This is the correct behavior of my patch because the grpc_cpp_plugin >> from the cross build isn't usable during cross build. You need the >> grpc_cpp_plugin from the host and therefore have to search the >> grpc_cpp_plugin by yourself during cross compile [1]. >> >> My first patch was rejected and therefore I create a minimal patch which >> only make the CMake gRPC config usable. >> >>> >>> | -- Using gRPC 1.45.1 >>> .... >>> | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): >>> | Error evaluating generator expression: >>> | >>> | $<TARGET_FILE:gRPC::grpc_cpp_plugin> >>> | >>> | No target "gRPC::grpc_cpp_plugin" >>> | >>> | >>> | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): >>> | Error evaluating generator expression: >>> | >>> | $<TARGET_FILE:gRPC::grpc_cpp_plugin> >>> | >>> | No target "gRPC::grpc_cpp_plugin" >>> | >>> | >>> | CMake Error at modules/grpc/CMakeLists.txt:37 (add_custom_command): >>> | Error evaluating generator expression: >>> | >>> | $<TARGET_FILE:gRPC::grpc_cpp_plugin> >>> | >>> | No target "gRPC::grpc_cpp_plugin" >>> >>> Here is my CMake source file: >>> >>> # Find Protobuf installation Yocto SDK doensn't support protobuf-config.cmake >>> # for the moment >>> set(protobuf_MODULE_COMPATIBLE TRUE) >>> find_package(Protobuf REQUIRED) >>> message(STATUS "Using protobuf ${Protobuf_VERSION}") >>> set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) >>> >>> # Find gRPC installation Looks for gRPCConfig.cmake file installed by gRPC's >>> # cmake installation. >>> find_package(gRPC CONFIG REQUIRED) >>> message(STATUS "Using gRPC ${gRPC_VERSION}") >>> set(_REFLECTION gRPC::grpc++_reflection) >>> set(_GRPC_GRPCPP gRPC::grpc++) >>> >>> # Get full path of protobuf/gRPC compiler >>> set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>) >>> set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) >> >> You have to search the binaries if you cross compile [1]: >> >> if(CMAKE_CROSSCOMPILING) >> find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) >> else() >> set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) >> endif() > > Thanks this fix my issue > > Tested-by: Clément Péron <peron.clem@gmail.com> Thanks for the test. Maybe you could comment to the grpc pull request to get attention. >>> Do you have an example of how you look for gRPC in your recipe? >> >> This isn't possible because you use a target and not a variable. > > Maybe a dumb question but how protobuf-compiler handle this? I don't know. The recipe use autotools and not cmake at the moment. The CMake project have a module for protobuf [2] to create the targets. The grpc example use the same code as above to find the program if you cross compile. >> [1] https://github.com/grpc/grpc/blob/master/examples/cpp/cmake/common.cmake [2] https://cmake.org/cmake/help/latest/module/FindProtobuf.html Regards Stefan
diff --git a/meta-oe/recipes-devtools/grpc/grpc/0001-cmake-add-separate-export-for-plugin-targets.patch b/meta-oe/recipes-devtools/grpc/grpc/0001-cmake-add-separate-export-for-plugin-targets.patch new file mode 100644 index 000000000..679bd3882 --- /dev/null +++ b/meta-oe/recipes-devtools/grpc/grpc/0001-cmake-add-separate-export-for-plugin-targets.patch @@ -0,0 +1,93 @@ +From 3150cb043363e05588062dd392b940be25594713 Mon Sep 17 00:00:00 2001 +From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> +Date: Tue, 18 Feb 2020 14:17:07 +0100 +Subject: [PATCH] cmake: add separate export for plugin targets + +Upstream-Status: Submitted [https://github.com/grpc/grpc/pull/29328] + + +--- + CMakeLists.txt | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index efdaf8936d..6608b1b00c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10935,7 +10935,7 @@ target_link_libraries(grpc_cpp_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_cpp_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_cpp_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -10975,7 +10975,7 @@ target_link_libraries(grpc_csharp_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_csharp_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_csharp_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -11015,7 +11015,7 @@ target_link_libraries(grpc_node_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_node_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_node_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -11055,7 +11055,7 @@ target_link_libraries(grpc_objective_c_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_objective_c_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_objective_c_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -11095,7 +11095,7 @@ target_link_libraries(grpc_php_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_php_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_php_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -11135,7 +11135,7 @@ target_link_libraries(grpc_python_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_python_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_python_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -11175,7 +11175,7 @@ target_link_libraries(grpc_ruby_plugin + + + if(gRPC_INSTALL) +- install(TARGETS grpc_ruby_plugin EXPORT gRPCTargets ++ install(TARGETS grpc_ruby_plugin EXPORT gRPCPluginTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + BUNDLE DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} +@@ -17349,6 +17349,10 @@ if(gRPC_INSTALL) + DESTINATION ${gRPC_INSTALL_CMAKEDIR} + NAMESPACE gRPC:: + ) ++ install(EXPORT gRPCPluginTargets ++ DESTINATION ${gRPC_INSTALL_CMAKEDIR} ++ NAMESPACE gRPC:: ++ ) + endif() + + include(CMakePackageConfigHelpers) +-- +2.30.2 + diff --git a/meta-oe/recipes-devtools/grpc/grpc_1.45.1.bb b/meta-oe/recipes-devtools/grpc/grpc_1.45.1.bb index 872bc6afc..292ea7f9b 100644 --- a/meta-oe/recipes-devtools/grpc/grpc_1.45.1.bb +++ b/meta-oe/recipes-devtools/grpc/grpc_1.45.1.bb @@ -24,6 +24,7 @@ SRCREV_grpc = "1c159689ceda2c408f7f9d97d96a264c9521b806" BRANCH = "v1.45.x" SRC_URI = "git://github.com/grpc/grpc.git;protocol=https;name=grpc;branch=${BRANCH} \ file://0001-Revert-Changed-GRPCPP_ABSEIL_SYNC-to-GPR_ABSEIL_SYNC.patch \ + file://0001-cmake-add-separate-export-for-plugin-targets.patch \ " # Fixes build with older compilers 4.8 especially on ubuntu 14.04 CXXFLAGS:append:class-native = " -Wl,--no-as-needed" @@ -80,8 +81,6 @@ do_configure:prepend:toolchain-clang:x86() { BBCLASSEXTEND = "native nativesdk" -SYSROOT_DIRS_IGNORE:append:class-target = " ${baselib}/cmake/grpc" - FILES:${PN}-compiler += " \ ${bindir} \ ${libdir}/libgrpc_plugin_support${SOLIBS} \