使用预安装的包从源代码构建grpc

时间:2018-06-15 11:58:20

标签: cmake grpc c-ares

我正在尝试将gRPC集成到现有项目中。它已经包含安装了所有gRPC依赖项的目录(ssl,c-ares,protobuf和zlib)。我想在构建gRPC时使用它们,并将gRPC安装到同一目录中。 我下载了gRPC存档(没有克隆位于grpc / third_party /中的子模块),并尝试生成构建系统,用于构建和安装gRPC到我的目标文件夹(使用cmake)。

我使用了以下命令:

cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DgRPC_ZLIB_PROVIDER=package -DgRPC_PROTOBUF_PROVIDER=package -DgRPC_SSL_PROVIDER=package -DgRPC_CARES_PROVIDER=package

并收到错误:

CMake Error at cmake/cares.cmake:34 (find_package):
Could not find a package configuration file provided by "c-ares" with any
of the following names:

c-aresConfig.cmake
c-ares-config.cmake
Add the installation prefix of "c-ares" to CMAKE_PREFIX_PATH or set
"c-ares_DIR" to a directory containing one of the above files.  If "c-ares"
provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
CMakeLists.txt:116 (include)
-- Configuring incomplete, errors occurred!

我有1.1版本的c-ares(来自https://c-ares.haxx.se/),它是使用

构建的
./configure --prefix=$PREFIX
make && make install

并且它不提供上述任何文件(c-aresConfig.cmake,c-ares-config.cmake)。

我试图从github获取c-ares并使用cmake构建它,并且已经成功:请求的文件出现在安装目录中,因此gRPC构建系统已成功生成。

我的问题是:我可以在不更新g -ub版本的情况下构建和安装gRPC吗?

如果不能轻易做到这一点,也许有可能以某种方式禁用gRPC中c-ares的使用(改为使用原生的dns解析器)?

2 个答案:

答案 0 :(得分:0)

请在项目的Cmakelists中找到gRPC包。如果可能的话也可以找到包裹。所以添加看起来像

find_package(gRPC REQUIRED) find_package(c-ares REQUIRED)

另请看一下链接: CMake: Of what use is find_package() if you need to specify CMAKE_MODULE_PATH anyway?

答案 1 :(得分:0)

c-ares有两个正在使用的构建系统,CMake和自动工具。它同时支持两者,但是您需要选择一个。自动工具的存在时间已经更长,并且是UNIX环境中传统上使用的一种。来自Linux发行版的c-ares的二进制软件包将使用自动工具,例如如果您dnf install c-ares-devel,您将获得基于自动工具的c-ares版本。

自动工具构建系统将安装pkgconfig文件libcares.pc,以提供有关如何使用c-ares的信息。 CMake系统将安装c-ares-config.cmake来完成此操作。

所以这里的问题是您正在使用自动工具构建c-ares,但是gRPC仅考虑了使用CMake构建c-ares的可能性。

因此,您可以切换到使用CMake构建c-ares或修补gRPC,以为c-ares使用pkgconfig文件提供更好的查找模块。 CMake支持pkgconfig文件,因为它们在CMake存在之前就已经被广泛使用并且仍然被广泛使用,因此后者并不难。

或者,在为gRPC运行cmake时尝试定义-D_gRPC_CARES_LIBRARIES=cares-DgRPC_CARES_PROVIDER=kludge。这会使gRPC CMake代码伪装成不寻找c-ares,并假设“ -lcares”会找到它。