如何让柯南生成FindXXX.cmake?

时间:2016-07-29 02:05:35

标签: c++ conan

我一直在为我所使用的项目之一的所有库创建conan包。 我为每个人创建了一个conanfile.py,一切都很顺利。 我为一个虚拟代码创建了一个conanfile.txt,以确保所有内容都按预期工作。 我跑了

  

conan instal .. --build = missing

这已编译了所有包。我可以在我的CMake文件中使用$ {CONAN_INCLUDE_DIRS}和$ {CONAN_LIBS}。 但是我想将conan作为一种可选的处理方式,使用Find_package(...)作为获取库位置,链接和包含细节的方法。

所以我很想看到

  

柯南0.6的新功能!现在,conan为CMake find_package提供自动支持,而无需为每个包创建自定义FindXXX.cmake文件(conan 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:如果我理解正确,则不需要包方法。

1 个答案:

答案 0 :(得分:4)

编辑:自Conan 1.14以来,有一个cmake_find_package_multi生成器实际上会为您生成XXXCMake.cmake,其中包含符合您要求的传递目标。见here

Conan donesn自动创建 FindXXX.cmake 。 "新的0.6" message表示对于常见包,CMake安装(kitware)提供的FindXXX.cmake应该可以正常工作。

那是因为从conan 0.6我们将 CONAN_CMAKE_MODULE_PATH CMAKE_PREFIX_PATH 变量设置为包的根文件夹,因此CMake find_library函数应该能够找到那里的图书馆。

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

因此,在您使用 OpenMPI 的特定情况下,CMake安装不提供正式的 FindOpenMPI.cmake 文件,因此您需要创建它并将其添加到你的柯南包。让我们看一下ZLIB library conan's package的例子:

  1. 创建名为FindOpenMPI.cmake的文件并将其保存在您的conan软件包根文件夹中。我通常建议从kitware复制原始的FindXXX.cmake文件(如果提供了文件夹Modules / Find ***。cmake)。并稍微修改它以帮助查找我们的库文件。如果没有提供(您的情况)这不是问题,请看一下这个例子:
  2.  
    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. 在package方法中,将FindOpenMPI.cmake文件复制到根目录:

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

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

      您的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()