создать несколько бинарных версий для каждой общей библиотеки - PullRequest
1 голос
/ 26 мая 2011

Я хочу создать исполняемый файл go, который взаимодействует с xen через его собственный интерфейс.Для этой цели существует общая библиотека C (фактически 2), и я создал простую оболочку go с помощью cgo.

Проблема заключается в том, что я хочу настроить 3 версии xen (3.2, 3.4, 4.0), каждая изкоторая имеет другую общую библиотеку.Сама библиотека предоставляет в основном один и тот же API, но размеры и форма структур, определенных в заголовке C, отличаются, и поэтому один и тот же скомпилированный двоичный файл не может использоваться с этими различными общими библиотеками.

Я хочуесть бинарный файл go, содержащий 'main' и go pkg, который является оболочкой для xen.

Я думал о 2 решениях:

  1. Я мог бы построить 3 разныхверсии скомпилированного pkg, а также 3 разных версии основного двоичного файла, каждая из которых связана с соответствующей версией pkg.Это решение требует создания make-файлов вручную, чтобы я мог передавать правильные пути и т. Д.

  2. Я мог бы создать оболочку 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, поскольку кажется, что в ней есть некоторая мудрость.

1 Ответ

1 голос
/ 26 мая 2011

Вы пробовали этот подход?

Код для конкретной архитектуры и операционной системы

Его можно легко адаптировать для использования переменной среды $ XENVER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...