Я хочу создать исполняемый файл go, который взаимодействует с xen через его собственный интерфейс.Для этой цели существует общая библиотека C (фактически 2), и я создал простую оболочку go с помощью cgo.
Проблема заключается в том, что я хочу настроить 3 версии xen (3.2, 3.4, 4.0), каждая изкоторая имеет другую общую библиотеку.Сама библиотека предоставляет в основном один и тот же API, но размеры и форма структур, определенных в заголовке C, отличаются, и поэтому один и тот же скомпилированный двоичный файл не может использоваться с этими различными общими библиотеками.
Я хочуесть бинарный файл go, содержащий 'main' и go pkg, который является оболочкой для xen.
Я думал о 2 решениях:
Я мог бы построить 3 разныхверсии скомпилированного pkg, а также 3 разных версии основного двоичного файла, каждая из которых связана с соответствующей версией pkg.Это решение требует создания make-файлов вручную, чтобы я мог передавать правильные пути и т. Д.
Я мог бы создать оболочку thin C в качестве разделяемой библиотеки и построить ее в 3 версиях против 3 версийxen C привязки.Эта обертка C затем экспортирует стабильный интерфейс C, который затем используется одним пакетом go.Затем я могу развернуть правильную общую библиотеку оболочки C на хостах и разрешить ее во время выполнения
Есть ли другой способ справиться с этим?Я бы предпочел использовать чистый (c) go код, но мне не нравится дополнительное бремя поддержки сложных make-файлов.
EDIT: Подробнее о том, почему я чувствую себя некомфортно при обработке этого вручную в make-файлах:
Например, имя _obj dir жестко закодировано в Make.inc и компании, и эти make-файлы основаны на некоторых сгенерированных файлах .c, содержащих специальную информацию об имени разделяемой библиотеки, которую я должен очистить перед созданием следующейверсия ПКГ.Отрывок моего make-файла:
all:
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=3.0
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=3.4
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=4.0
, где Makefile.common - это обычный make-файл pkg, который использует TARG=$(XENVERSION)/vimini/xen
, так как я не могу закодировать версию в имени пакета, потому что мне придется изменить импортв источнике.
Кодируя версию в каталоге пакета, я могу использовать GCIMPORTS=-I../../pkg/xen/_obj/$(XENVERSION)
для выбора правильного варианта в главном Makefile cmd.
Конечно, я могу развернуть свой собственный make-файл, который вызывает 6c и6l, cgo и т. Д., Но я предпочитаю использовать существующую инфраструктуру make, поскольку кажется, что в ней есть некоторая мудрость.