如何从柯南配方的要求中获取正确的值作为CMake参数?

时间:2017-08-29 14:42:23

标签: c cmake conan rabbitmq-c

我正在编写用于为rabbitmq-c库创建包的配方。当选中 CMake 脚本中的 ENABLE_SSL_SUPPORT 选项时,需要 OpenSSL 库进行构建。

RabbitMQ C client library CMake GUI screen

在提供的调试发布版本 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 的静态版本还是动态版本用于链接 RabbitMQ-C dll 文件?

1 个答案:

答案 0 :(得分: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]

将转换为包含-DSSL_INCLUDE_PATH=<path to openssl include>标志的cmake命令。

如果你选择多配置包,你可以检查(http://docs.conan.io/en/latest/packaging/package_info.html#multi-configuration-packages)。他们将定义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)
    ...