Создавать привязки Go для нескольких версий библиотек?

Я столкнулся с небольшой икотой при попытке объединить поддержку GTK3 в < href="https://github.com/agl/go-gtk" rel="nofollow">вилка go-gtk, используемая пруд с вышестоящим go-gtk на основе GTK2 .

Эти строки cgo pkg-config, которые определяют версию GTK, должны фактически появляться в каждом файле, что предотвращает существование привязок, общих для GTK 2 и 3, в общем файле.

Я полагаю, что «идиоматический» хак для компиляции файла с несколькими версиями GTK: поместите общий код в файл foo_common.go, чтобы он никогда не собирался. Используйте скрипт perl или bash + sed для сборки foo2.go и foo3.go из foo_common.go, исправив строки cgo pkg-config и добавив директивы go build для тега gtk2.


person Jeff Burdges    schedule 06.03.2015    source источник


Ответы (1)


Для этого вы можете использовать теги build Constrain, также известные как теги.

Сначала вам нужно разделить файлы, которые используют gtk2 и gtk3, а затем предположить, что вы хотите, чтобы gtk3 был по умолчанию (я нахмурюсь, если вы сделаете gtk2 по умолчанию):

gtk3.go:

// +build !gtk2

package main

import "fmt"

func main() {
    fmt.Println("gtk3")
}

gtk2.go:

// +build gtk2

package main

import "fmt"

func main() {
    fmt.Println("gtk2")
}

Затем, чтобы проверить это:

$ go build; and ./constrains
gtk3
$ go build -tags gtk2; and ./constrains
gtk2
person OneOfOne    schedule 07.03.2015
comment
Нет. Тегов сборки недостаточно, потому что cgo pkg-config строк должно быть в каждом файле. Вы можете использовать теги сборки вместе с препроцессором, таким как cpp или perl, как я описал в вопросе. - person Jeff Burdges; 09.03.2015
comment
Да, я, конечно, согласен с тем, что gtk3 используется по умолчанию, не уверен, почему кто-то даже беспокоится о создании поддержки gtk2 на этом этапе, может быть, это меньшая занимаемая площадь или что-то в этом роде. - person Jeff Burdges; 09.03.2015