Я создавал пакеты с conan для всех библиотек, один из проектов, над которыми я работаю.
Я создал conanfile.py для всех, и все хорошо.
Я создал conanfile.txt для фиктивного кода, чтобы убедиться, что все работает как положено.
Я бегал
Конан установить .. —build = отсутствует
И это скомпилировало все пакеты. Я могу использовать $ {CONAN_INCLUDE_DIRS} и $ {CONAN_LIBS} в моих файлах CMake.
Однако я хотел бы использовать 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: Если я правильно понимаю, метод упаковки не нужен.
Конан не создает FindXXX.cmake автоматически. Сообщение «new in 0.6» означает, что для распространенных пакетов должен работать FindXXX.cmake, предоставляемый установкой CMake (kitware).
Это потому, что с Конана 0,6 мы устанавливаем CONAN_CMAKE_MODULE_PATH а также CMAKE_PREFIX_PATH переменные в корневую папку пакетов, поэтому функция CMake find_library должна быть в состоянии найти библиотеки там.
Но, к сожалению, это не всегда работает, и мы не задокументировали этот процесс правильно. Я скоро обновлю документы. Он работает только автоматически, если есть «официальный» findXXX, и не во всех случаях, потому что иногда официальный поиск файла findXXX.cmake для библиотек с именами файлов, отличными от создаваемых системой сборки (не подготовлен для поиска имен файлов для всех настроек conan может обрабатывать библиотеки библиотек или пакетов с разными именами, или иногда искать XXX по фиксированным путям, таким как c: \ OpenSSL и тому подобное).
Итак, в вашем конкретном случае с OpenMPI нет официального FindOpenMPI.cmake файл поставляется с установкой CMake, поэтому вам нужно будет создать его и добавить в ваш пакет conan. Давайте посмотрим на пример с Библиотека ZLIB Конана:
FindOpenMPI.cmake
и сохраните его в корневой папке вашего пакета conan. Я обычно рекомендую скопировать оригинальный файл FindXXX.cmake из kitware, если он есть (папка 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
,
В вашем 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()
Других решений пока нет …