Как сделать так, чтобы conan генерировал FindXXX.cmake?

Я создавал пакеты с 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: Если я правильно понимаю, метод упаковки не нужен.

4

Решение

Конан не создает 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 Конана:

  1. Создайте файл с именем 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,

  1. В вашем conanfile.py Добавьте файл FindOpenMPI.cmake в экспорт:

    exports = ["FindOpenMPI.cmake"]

  2. В методе пакета скопируйте файл 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()
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]