From b27a709a1822772ee7da806193702a2b772a2c21 Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Wed, 30 Nov 2022 19:19:47 +0100 Subject: [PATCH] Use pkg-config to find gRPC libraries if CMake package is not found Look for the gRPC libraries using PkgConfig module. This helps to find gRPC on systems that don't have CMake packages installed. Task-number: QTBUG-108833 Change-Id: Iaaa9d38facd6490c3d96d9eb30b0cdddde46edde Reviewed-by: Alexandru Croitor --- cmake/FindWrapgRPC.cmake | 45 +++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/cmake/FindWrapgRPC.cmake b/cmake/FindWrapgRPC.cmake index aedac66d..dd90e9c2 100644 --- a/cmake/FindWrapgRPC.cmake +++ b/cmake/FindWrapgRPC.cmake @@ -8,10 +8,7 @@ endif() set(WrapgRPC_FOUND FALSE) -set(__WrapgRPC_find_package_args "") -if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) - list(APPEND __WrapgRPC_find_package_args QUIET) -endif() +set(__WrapgRPC_find_package_args QUIET) if(NOT TARGET Threads::Threads) find_package(Threads ${__WrapgRPC_find_package_args}) @@ -34,7 +31,45 @@ if(TARGET ZLIB::ZLIB) qt_internal_disable_find_package_global_promotion(ZLIB::ZLIB) endif() -if(gRPC_FOUND AND TARGET gRPC::grpc AND TARGET gRPC::grpc++) +function(WrapgRPC_ensure_grpc_lib libname) + if(TARGET gRPC::${libname}) + return() + endif() + pkg_check_modules(PC_${libname} QUIET ${libname}) + if(NOT PC_${libname}_FOUND) + return() + endif() + + find_library(${libname}_LIBRARY NAMES ${libname} HINTS ${PC_${libname}_LIBDIR}) + if(NOT ${libname}_LIBRARY) + return() + endif() + + find_path(${libname}_INCLUDE_DIRS NAMES ${libname}/${libname}.h ${PC_${libname}_INCLUDEDIR}) + if(NOT ${libname}_INCLUDE_DIRS) + return() + endif() + + add_library(gRPC::${libname} UNKNOWN IMPORTED) + set_target_properties(gRPC::${libname} PROPERTIES + IMPORTED_LOCATION ${${libname}_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES "${${libname}_INCLUDE_DIRS}" + ) +endfunction() + + +if(NOT TARGET gRPC::grpc OR NOT TARGET gRPC::grpc++) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + WrapgRPC_ensure_grpc_lib(grpc) + WrapgRPC_ensure_grpc_lib(grpc++) + endif() +endif() + +unset(WrapgRPC_ensure_grpc_lib) + +if(TARGET gRPC::grpc + AND TARGET gRPC::grpc++) add_library(WrapgRPC::WrapLibgRPC INTERFACE IMPORTED) target_link_libraries(WrapgRPC::WrapLibgRPC INTERFACE gRPC::grpc gRPC::grpc++) get_target_property(Grpc_INCLUDE_PATH gRPC::grpc++ INTERFACE_INCLUDE_DIRECTORIES)