4

我一直在为我从事的项目之一使用的所有库创建带有柯南的软件包。我为每一个都创建了一个 conanfile.py,一切都很好。我为虚拟代码创建了一个 conanfile.txt,以确保一切都按预期工作。我跑了

柯南安装 .. --build=missing

这已经编译了所有的包。我可以在我的 CMake 文件中使用 ${CONAN_INCLUDE_DIRS} 和 ${CONAN_LIBS}。但是,我希望将柯南作为一种可选的做事方式,使用 Find_package(...) 作为获取库位置、链接和包含详细信息的一种方式。

所以我很想看到

柯南 0.6 新内容!现在柯南为 CMake find_package 提供了自动支持,而无需为每个包创建自定义 FindXXX.cmake 文件(柯南 0.5)。

所以我认为它应该工作。但是没有生成 FindXXX.cmake 文件。

这是我的一个 conanfile.py 作为 OpenMPI 的示例:

from conans import ConanFile
import os
from conans.tools import download
from conans.tools import unzip
from conans import CMake
from conans import ConfigureEnvironment

class OpenMPIConan(ConanFile):
    name = "OpenMPI"
    version = "2.0.0"
    generators = "cmake"
    settings = "os", "arch", "compiler", "build_type"
    url="https://www.open-mpi.org/software/ompi/v2.0/"
    license="https://www.open-mpi.org/community/license.php"
    source_url = "https://www.open-mpi.org/software/ompi/v2.0/downloads/openmpi-2.0.0.tar.bz2"
    unzipped_path = "openmpi-2.0.0/"


    def source(self):
        self.zip_name = os.path.basename(self.source_url)
        download(self.source_url, self.zip_name)
        unzip(self.zip_name)
        os.unlink(self.zip_name)

    def build(self):
        self.run("%s/%s/configure --enable-mpi-thread-multiple --enable-mpi-cxx --prefix=%s CC=clang CXX=clang++" % (self.conanfile_directory, self.unzipped_path, self.package_folder))
        self.run("%s make -j 8 install" % env.command_line)

    def package(self):
        self.copy("*.h", dst="include", src="install/include")
        self.copy("*.lib", dst="lib", src="install/lib")
        self.copy("*.a", dst="lib", src="install/lib")

    def package_info(self):
        self.cpp_info.libs = ["mpi", "mpi_cxx"]

为什么没有创建 FineOpenMPI.cmake 文件?我怎样才能确保它被创建?

PS:如果我理解正确的话,不需要打包方法。

4

1 回答 1

4

编辑:自柯南 1.14 以来,有一个cmake_find_package_multi生成器实际上会为您生成XXXCMake.cmake具有传递目标的您的要求。看这里


柯南不会自动创建FindXXX.cmake。“new in 0.6”消息意味着对于普通包,CMake安装(套件)提供的FindXXX.cmake应该可以工作。

这是因为从柯南 0.6 开始,我们将CONAN_CMAKE_MODULE_PATHCMAKE_PREFIX_PATH变量设置为包的根文件夹,因此 CMake find_library 函数应该能够在那里找到库。

但遗憾的是,它并不总是有效,而且我们没有正确记录这个过程。我会尽快更新文档。它只有在有“官方”findXXX 时才会自动工作,而不是在所有情况下,因为有时官方 findXXX.cmake 文件会搜索与构建系统创建的文件名不同的库(不准备搜索所有设置的文件名conan 可以处理或库具有不同名称的包库,或者有时 findXXX 在固定路径(如 c:\OpenSSL 等)中搜索)。

因此,在您使用OpenMPI的特定情况下,没有 CMake 安装提供的官方FindOpenMPI.cmake文件,因此您需要创建它并将其添加到您的柯南包中。让我们看一个ZLIB 库柯南包的例子:

  1. 创建一个名为的文件FindOpenMPI.cmake并将其保存在您的柯南包根文件夹中。如果提供的话,我通常建议从套件中复制原始的 FindXXX.cmake 文件(文件夹 Modules/Find***.cmake)。并对其稍作修改以帮助查找我们的库文件。如果未提供(您的情况),这不是问题,请查看以下示例:
find_path(ZLIB_INCLUDE_DIR NAMES zlib.h PATHS ${CONAN_INCLUDE_DIRS_ZLIB})
find_library(ZLIB_LIBRARY NAMES ${CONAN_LIBS_ZLIB} PATHS ${CONAN_LIB_DIRS_ZLIB})

set(ZLIB_FOUND TRUE)  
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
mark_as_advanced(ZLIB_LIBRARY ZLIB_INCLUDE_DIR)

在第一行中,我们向 CMake 指示应该找到我们的头文件的路径CONAN_INCLUDE_DIRS_XXX,然后对于库名称CONAN_LIBS_XXX和库所在的路径也是如此CONAN_LIB_DIRS_XXX

  1. 在您的conanfile.py文件中,将 FindOpenMPI.cmake 添加到导出中:

    exports = ["FindOpenMPI.cmake"]

  2. 在打包方法中,将 FindOpenMPI.cmake 文件复制到根目录下:

    self.copy("FindOpenMPI.cmake", ".", ".")

我建议创建一个与我们在上面看到的 ZLIB 示例非常相似的干净 FindOpenMP.cmake 文件,并尝试它是否有效。

您的 CMakeLists.txt 可能如下所示:

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
CONAN_BASIC_SETUP()

find_package("OpenMPI")

IF(OpenMPI_FOUND)
    ADD_EXECUTABLE(xxxxxx source1.c)
    include_directories(${OpenMPI_INCLUDE_DIRS})
    TARGET_LINK_LIBRARIES(xxxxxx ${OpenMPI_LIBRARIES})
ELSE()
    MESSAGE(FATAL_ERROR "OpenMPI not found")
ENDIF()
于 2016-07-29T08:13:23.737 回答