Conan-Package: получение скомпилированных файлов из других Conan-пакетов

Я использую 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-пакет в папке под названием скрипты, или есть другой способ сделать это?

Спасибо,
Крис

2

Решение

Есть разные способы доступа к файлам из ваших зависимостей:

  • Если вы хотите напрямую запустить какой-либо файл из ваших зависимостей, вы можете использовать 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
0

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

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