如何让柯南生成一个FindXXX.cmake?
How do I make conan generate a FindXXX.cmake?
我一直在为我从事的项目之一使用的所有库创建带有 conan 的包。
我为每个都创建了一个 conanfile.py,一切都很好。
我为虚拟代码创建了一个 conanfile.txt 以确保一切都按预期工作。
我 运行
conan instal .. --build=missing
这已经编译了所有的包。我可以在我的 CMake 文件中使用 ${CONAN_INCLUDE_DIRS} 和 ${CONAN_LIBS} 。
但是,我希望将柯南作为一种可选的处理方式,使用 Find_package(...) 作为获取库位置、链接和包含详细信息的方式。
所以我很想看到
New in Conan 0.6! Now conan provides automatic support for CMake find_package without creating a custom FindXXX.cmake file for each package (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:如果我没理解错的话,package方法是不需要的
编辑:从柯南 1.14 开始,有一个 cmake_find_package_multi
生成器,它实际上会为您生成 XXXCMake.cmake
并满足您的要求。参见 here
柯南不会自动创建 FindXXX.cmake。 "new in 0.6" 消息意味着对于普通包,CMake 安装(工具包)提供的 FindXXX.cmake 应该可以工作。
那是因为从柯南0.6开始我们设置了CONAN_CMAKE_MODULE_PATH和CMAKE_PREFIX_PATH变量到包,所以 CMake find_library 函数应该能够在那里找到库。
但遗憾的是,它并不总是有效,而且我们没有正确记录此过程。我会尽快更新文档。它仅在存在 "official" findXXX 时自动工作,而不是在所有情况下,因为有时官方 findXXX.cmake 文件搜索与构建系统创建的文件名不同的库(不准备搜索文件conan 可以处理的所有设置的名称或具有不同名称的库包库,或者有时 findXXX 搜索固定路径,如 c:\OpenSSL 和类似的东西)。
因此,在您使用 OpenMPI 的特定情况下,CMake 安装没有提供官方 FindOpenMPI.cmake 文件,因此您将需要创建它并将其添加到您的 conan 包中。让我们看一个 ZLIB library conan's package:
的例子
- 创建一个名为
FindOpenMPI.cmake
的文件并将其保存在您的 conan 包根文件夹中。我通常建议从套件中复制原始 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 应该找到我们的 headers 的路径 CONAN_INCLUDE_DIRS_XXX
,然后对于带有 CONAN_LIBS_XXX
的库名称和库是 CONAN_LIB_DIRS_XXX
.
在您的 conanfile.py
文件中将 FindOpenMPI.cmake 添加到导出中:
exports = ["FindOpenMPI.cmake"]
打包方法中,将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()
我一直在为我从事的项目之一使用的所有库创建带有 conan 的包。 我为每个都创建了一个 conanfile.py,一切都很好。 我为虚拟代码创建了一个 conanfile.txt 以确保一切都按预期工作。 我 运行
conan instal .. --build=missing
这已经编译了所有的包。我可以在我的 CMake 文件中使用 ${CONAN_INCLUDE_DIRS} 和 ${CONAN_LIBS} 。 但是,我希望将柯南作为一种可选的处理方式,使用 Find_package(...) 作为获取库位置、链接和包含详细信息的方式。
所以我很想看到
New in Conan 0.6! Now conan provides automatic support for CMake find_package without creating a custom FindXXX.cmake file for each package (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:如果我没理解错的话,package方法是不需要的
编辑:从柯南 1.14 开始,有一个 cmake_find_package_multi
生成器,它实际上会为您生成 XXXCMake.cmake
并满足您的要求。参见 here
柯南不会自动创建 FindXXX.cmake。 "new in 0.6" 消息意味着对于普通包,CMake 安装(工具包)提供的 FindXXX.cmake 应该可以工作。
那是因为从柯南0.6开始我们设置了CONAN_CMAKE_MODULE_PATH和CMAKE_PREFIX_PATH变量到包,所以 CMake find_library 函数应该能够在那里找到库。
但遗憾的是,它并不总是有效,而且我们没有正确记录此过程。我会尽快更新文档。它仅在存在 "official" findXXX 时自动工作,而不是在所有情况下,因为有时官方 findXXX.cmake 文件搜索与构建系统创建的文件名不同的库(不准备搜索文件conan 可以处理的所有设置的名称或具有不同名称的库包库,或者有时 findXXX 搜索固定路径,如 c:\OpenSSL 和类似的东西)。
因此,在您使用 OpenMPI 的特定情况下,CMake 安装没有提供官方 FindOpenMPI.cmake 文件,因此您将需要创建它并将其添加到您的 conan 包中。让我们看一个 ZLIB library conan's package:
的例子- 创建一个名为
FindOpenMPI.cmake
的文件并将其保存在您的 conan 包根文件夹中。我通常建议从套件中复制原始 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 应该找到我们的 headers 的路径 CONAN_INCLUDE_DIRS_XXX
,然后对于带有 CONAN_LIBS_XXX
的库名称和库是 CONAN_LIB_DIRS_XXX
.
在您的
conanfile.py
文件中将 FindOpenMPI.cmake 添加到导出中:exports = ["FindOpenMPI.cmake"]
打包方法中,将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()