Как получить правильные значения из требований в рецепте Конана, которые будут использоваться в качестве параметров CMake?

Я пишу рецепт создания пакета для библиотеки rabbitmq-c. Когда опция ENABLE_SSL_SUPPORT в сценарии CMake включена, для сборки требуется библиотека OpenSSL.

Клиентская библиотека RabbitMQ C Экран графического интерфейса CMake

Как показано на предоставленном экране, требуются пути к версиям Debug и Release файлов libeay.lib и ssleay.lib.

В моем conanfile.py за rabbitmq-c Библиотека У меня есть следующий код, который описывает зависимость.

def requirements(self):
    if self.options.ssl_support:
        self.requires("OpenSSL/1.0.2l@bobeff/stable")

Как получить правильные значения из необходимого пакета OpenSSL, чтобы установить их в настройках CMake для рецепта RabbitMQ-C?

Посылка OpenSSL/1.0.2l@bobeff/stable можно строить с разными настройками и опциями. Как выбрать, какой использовать при сборке RabbitMQ-C? Например, как выбрать, использовать ли статическую или динамическую версию OpenSSL для связи с файлами DLL RabbitMQ-C?

1 ответ

Решение

У вас есть полный доступ к модели зависимостей внутри вашего build() метод, так что вы можете получить доступ к:

def build(self):
    print(self.deps_cpp_info["OpenSSL"].rootpath)
    print(self.deps_cpp_info["OpenSSL"].include_paths)
    print(self.deps_cpp_info["OpenSSL"].lib_paths)
    print(self.deps_cpp_info["OpenSSL"].bin_paths)
    print(self.deps_cpp_info["OpenSSL"].libs)
    print(self.deps_cpp_info["OpenSSL"].defines)
    print(self.deps_cpp_info["OpenSSL"].cflags)
    print(self.deps_cpp_info["OpenSSL"].cppflags)
    print(self.deps_cpp_info["OpenSSL"].sharedlinkflags)
    print(self.deps_cpp_info["OpenSSL"].exelinkflags)

Также, если вы хотите получить доступ к агрегированным значениям (для всех зависимостей / требований), вы можете сделать:

def build(self):
   print(self.deps_cpp_info.include_paths)
   print(self.deps_cpp_info.lib_paths)
   ...

Итак, учитывая эти значения, вы можете передать их в вашу систему сборки, в случае с CMake вы можете сделать что-то вроде:

def build(self):
    cmake = CMake(self)
    # Assuming there is only 1 include path, otherwise, we could join it
    cmake.definitions["SSL_INCLUDE_PATH"] = self.deps_cpp_info["OpenSSL"].include_paths[0]

Это будет переведено в команду cmake, включая -DSSL_INCLUDE_PATH=<path to openssl include> флаг.

Если вы выбираете многоконфигурационные пакеты, вы можете проверить ( http://docs.conan.io/en/latest/packaging/package_info.html). Они будут определять debug, release конфиги, которые вы можете позже использовать в вашей модели:

def build(self):
    # besides the above values, that will contain data for both configs
    # you can access information specific for each configuration
    print(self.deps_cpp_info["OpenSSL"].debug.rootpath)
    print(self.deps_cpp_info["OpenSSL"].debug.include_paths)
    ...
    print(self.deps_cpp_info["OpenSSL"].release.rootpath)
    print(self.deps_cpp_info["OpenSSL"].release.include_paths)
    ...
Другие вопросы по тегам