Я использую Conan в качестве менеджера зависимостей для C ++ и хочу создать пакет, который требует скомпилированный файл из другого, уже созданного, Conan-пакета.
В настоящее время я пытаюсь создать пакет для библиотеки OpenStreetMap OSM-бинарная (https://github.com/scrosby/OSM-binary.git).
Makefile для этого проекта (который можно найти на ./ ОСМ-бинарный / SRC / Makefile) требуется файл с именем protoc от Protobuf-проект (https://github.com/google/protobuf). это protoc-файл можно найти после компиляции Protobuf-проект в ./ Protobuf / SRC.
Без этого файла компиляция OSM-источников завершится с ошибкой: make: ../protoc: Command not found
Эта проблема
Поскольку документация Конана предлагает скопировать мои необходимые файлы в папки в моем пакете, например, заголовочные файлы в ./включают, любит/ Lib, и т.п.
Согласно этому, после строительства Protobuf-проект через make я копирую указанный файл через
def package(self):
self.copy("*.so", dst="lib", keep_path=False)
self.copy("protoc", dst="scripts", src="./protobuf/src")
в папку под названием «скрипты».
Но в этот момент начинается черная магия.
Мой первый вопрос: как я могу получить доступ к любому из этих упакованных файлов (например, к файлам * .so или любым другим файлам (в данном случае к протоколу protoc), присутствующим в пакете) из другого пакета?
Для меня даже после прочтения документации Конана не ясно, как Конан хранит свои упакованные файлы и как получить доступ к этим или любым другим файлам, упакованным на предыдущем шаге.
Теперь вернемся к OSM-проект мой подход будет установить правильный путь вручную в Makefile через tools.replace
команда.
Сначала я объявил протобуф-упакованный как требование
requires = "protobuf/2.5.0@test/testing"
и заменил соответствующие строки (в версии 1.3.3, строка 7) в файле osm-Makefile на правильный путь к protoc-файл.
tools.replace_in_file("OSM-binary/src/Makefile",
"PROTOC ?= protoc",
"PROTOC ?= <path-to-file>/protoc")
Теперь это приводит нас к моему актуальному вопросу: как мне найти путь к protoc-файл, который можно найти в Protobuf-пакет в папке под названием скрипты, или есть другой способ сделать это?
Спасибо,
Крис
Есть разные способы доступа к файлам из ваших зависимостей:
Если вы хотите напрямую запустить какой-либо файл из ваших зависимостей, вы можете использовать self.run(...., run_environment=True)
, это автоматически установит PATH, LD_LIBRARY_PATH и т. д., чтобы двоичные файлы находились в том месте, где установлен пакет. Найти больше информации Вот
Вы можете напрямую import
файлы, которые вы хотите от ваших зависимостей, делая копию (что делается до build()
Метод) таких файлов в папку сборки, поэтому они могут быть использованы непосредственно там. Путь, который вы можете использовать в вашем скрипте, является текущим, или self.build_folder
, Импортированные файлы будут автоматически удалены после сборки, поэтому они не будут случайно перепакованы. Проверьте импорт документов
Вы можете получить информацию от ваших зависимостей от self.deps_cpp_info
приписывать. Проверить ссылка здесь. Это означает, что вы можете получить пути к вашему protobuf
зависимость с чем-то вроде
def build(self): # Get the directory where protobuf package is installed protoc_root = self.deps_cpp_info["protobuf"].rootpath # Note this is a list protoc_bin_paths = self.deps_cpp_info["protobuf"].bin_paths
Других решений пока нет …