Сборка grpc из исходного кода с использованием предустановленных пакетов

Я пытаюсь интегрировать 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!

У меня есть c-ares версии 1.14.0 (из https://c-ares.haxx.se/), он построен с использованием

./configure --prefix=$PREFIX
make && make install

и он не предоставляет ни одного из перечисленных выше файлов (c-aresConfig.cmake, c-ares-config.cmake).

Я попытался получить c-ares из github и собрать его с помощью cmake, и все получилось: запрошенные файлы появились в установочном каталоге, поэтому система сборки gRPC была сгенерирована успешно.

Мой вопрос: могу ли я собрать и установить gRPC без обновления c-ares до github-версии?

Если это не может быть легко сделано, возможно, можно как-то отключить использование c-ares в gRPC (вместо этого используйте native dns resolver)?

1 ответ

У c-ares есть две системы сборки, которые используются здесь: CMake и autotools. Он поддерживает оба, но вам нужно выбрать один. Автоинструменты существуют дольше и традиционно используются в средах UNIX. Бинарные пакеты c-ares из дистрибутивов Linux будут использовать автоинструменты, например, если вы dnf install c-ares-devel, вы получите основанную на autotools сборку c-ares.

Система сборки autotools устанавливает файл pkgconfig, libcares.pc, чтобы предоставить информацию о том, как использовать c-ares. Система CMake устанавливает c-ares-config.cmake сделать это.

Таким образом, проблема здесь в том, что вы создаете c-ares с помощью autotools, но gRPC рассматривал только возможность использования CMake для создания c-ares.

Таким образом, вы можете либо перейти к созданию c-ares с помощью CMake, либо установить патч gRPC, чтобы лучше найти модуль для c-ares, который работает с файлами pkgconfig. CMake поддерживает файлы pkgconfig, так как они широко использовались до появления CMake и до сих пор широко используются, поэтому последние не так сложны.

Или, пытаясь определить -D_gRPC_CARES_LIBRARIES=cares а также -DgRPC_CARES_PROVIDER=kludge при запуске cmake для gRPC. Это подделывает код gRPC CMake, который не ищет c-ares и предполагает, что "-lcares" его найдет.

Пожалуйста, найдите пакет gRPC в Cmakelists вашего проекта. Если возможно, также найти пакет услуг. Таким образом, дополнение будет выглядеть

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

Также взгляните на ссылку: CMake: для чего используется find_package(), если вам все равно нужно указать CMAKE_MODULE_PATH?

Другие вопросы по тегам