2016-07-29 50 views
3

我一直在爲所有圖書館的工作項目之一創建包含柯南的軟件包。 我爲每個都創建了conanfile.py,一切都很好。 我爲虛擬代碼創建了一個conanfile.txt文件,以確保所有內容都按預期工作。 我已經運行如何讓柯南生成FindXXX.cmake?

柯南INSTAL .. --build =缺少

而且已經編譯所有的軟件包。我可以在我的CMake文件中使用$ {CONAN_INCLUDE_DIRS}和$ {CONAN_LIBS}。 但是我希望將柯南作爲一種可選方式來處理,使用Find_package(...)作爲獲取庫位置,鏈接和包含細節的方式。

所以我很好奇地看到柯南0.6

新!現在,柯南提供了對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:如果我理解正確,則不需要軟件包方法。

回答

3

柯南打不開FindXXX.cmake自動。 「0.6以上版本」消息意味着對於通用軟件包,CMake安裝(kitware)提供的FindXXX.cmake應該可以工作。

這是因爲從柯南0.6,我們設定的CONAN_CMAKE_MODULE_PATHCMAKE_PREFIX_PATH變量包的根文件夾,所以CMake的find_library功能應該是能夠找到的圖書館有。

但可悲的是,它不是總是在工作,我們沒有正確記錄這個過程。我會盡快更新文檔。它只在有「官方」findXXX時纔會自動運行,而不是在所有情況下都會自動運行,因爲有時官方findXXX.cmake文件搜索的文件名不同於構建系統正在創建的文件名(不準備搜索所有設置的文件名柯南可以處理或使用不同名稱的庫軟件包庫,或者有時候findXXX在像c:\ OpenSSL之類的固定路徑中搜索)。

所以,在你與的openmpi特定情況下沒有被安裝的CMake提供的官方FindOpenMPI.cmake文件,所以您需要創建它,並在你的柯南包添加。讓我們來看看與ZLIB library conan's package一個例子:

  1. 創建一個名爲FindOpenMPI.cmake文件並將其保存在您的柯南包根文件夾。我通常建議從kitware複製原始FindXXX.cmake文件(文件夾模塊/查找***。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

  • 在你conanfile.py文件中添加FindOpenMPI.cmake到出口:

    exports = ["FindOpenMPI.cmake"]

  • 在封裝的方法,所述FindOpenMPI.cmake文件複製到根:

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

  • 我建議創建一個乾淨的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() 
    
    +0

    謝謝您的回答。這澄清了事情。 OpenMPI是一個MPI實現。從某種意義上說,這是我可以選擇的圖書館中最糟糕的例子,因爲它應該由FIndPackage(MPI)發現。我想我可以聲明它是MPI而不是OpenMPI,並通過版本名稱或通過創建設置來選擇實現(MPIch或OpenMPI)來說明它是OpenMPI。其他庫(例如Lua)應該被找到。 – Michel

    +0

    回到關於MPI的問題......(我可能會把另一個stackoverflow的問題)如果我有另一個庫,我想提供,並使用MPI,以便它應該與整個項目相同的MPI實現編譯,打包它並引用正確的MPI的最佳方法是什麼,以便在從源代碼編譯時找到正確的包含?我應該只使用'require'屬性嗎?如果這樣的話,設置如何傳遞下去? – Michel