Сборка Syncthing (GO) для entware-ng

Форум программистов
levantine
Сообщения: 10
Зарегистрирован: 11 ноя 2015, 00:39

Сообщение levantine » 22 фев 2016, 17:29

Здравствуйте.
Хочу собрать пакет Syncthing (DHT-синхронизация аля bittorrentsync, но с открытым исходным кодом):
https://github.com/syncthing/syncthing
Собирать буду для Keenetic GIGA III (прошивка 2.06 официальная с поддержкой opkg) под entware-ng
Основная проблема - нет нативного компилятора GO с поддержкой MIPS
Пока не понимаю точно, с какой стороны к этому подойти, на форуме syncthing нужной инфы нет.
По сборке приложений на GO под openwrt есть вот это:
https://github.com/GeertJohan/openwrt-go

Правильно ли я из всего этого делаю вывод, что мне надо:
1) Собрать тулчейн от entware-ng (http://forums.zyxmon.org/viewtopic.php?f=8&t=5227, target = mips-softfloat)
2) Скачать GO
2) Скачать и собрать gcc с поддержкой кросс-компиляции для go (https://github.com/golang/go/wiki/GccgoCrossCompilation)
3) Собрать при помощи gccgo сам syncthing
?

Я прочитал уже кучу инструкций и в результате имею кашу в голове. Прокомментируйте плз, выглядит ли здравым то, что я написал выше, и, если нет - куда копать?
Keenetic Giga III + Entware-Keenetic

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 22 фев 2016, 20:46

levantine, разбирайтесь дальше - нам интересно, что выйдет.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 24 фев 2016, 13:55

Собрать кросс-компилятор gccgo в случае системоной либы glibc оказалось не просто, а очень просто. Делал для архитектуры armv7. Нужно при сборке тулчейна (точнее для последнего этапа сборки gcc) добавить к строке TARGET_LANGUAGES в конце ",go". В результате будет собран кросскомпилятор go.
Собрал простейшую программу (Hello World):

Код: Выделить всё

package main

	

import "fmt"

	

func main() {
    fmt.Println("hello world")
}

с помощью

Код: Выделить всё

arm-openwrt-linux-gccgo -Wall -o helloworld_static_libgo h.go -Wl,-rpath=/opt/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 -static-libgo

(тут в h.go - исходный код) и получил бинарник размером более 2МБ, который проработал на нужной архитектуре.

Для uclibc все несколько сложнее. Как минимум нужно портировать патч - https://git.uclibc.org/uClibc/commit/?i ... b1aafee4af в используемую uclibc-ng
Без этих функций точно gccgo собрать не удастся.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 24 фев 2016, 16:21

Совместно с Александр Рыжов выяснили, что uclibc-ng содержит нужные функции. Нужно в файле https://github.com/Entware-ng/Entware-n ... ommon#L227 их включить. Для сборки потребуется патч типа такого
https://gcc.gnu.org/ml/gcc-patches/2014 ... 00240.html

levantine
Сообщения: 10
Зарегистрирован: 11 ноя 2015, 00:39

Сообщение levantine » 25 фев 2016, 00:55

Спасибо огромное, буду ковырять. Я не такой быстрый парень, пока еще билдрут на виртуалке не собрал.
Keenetic Giga III + Entware-Keenetic

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 26 фев 2016, 21:51

В ветке go53 - https://github.com/Entware-ng/Entware-ng/tree/go53
Исправленный тулчейн, в нем собирается gccgo в том числе и для mipsel с uclibc-ng. Поскольку изменены конфиг uclibc и версия gcc (для go 1.4 нужен gcc 5.x), нужно пересобрать и переустановить системные либы. Это до конца не проверялось.
Конфиг для сборки - mipsel.config.52.
Теперь попытаюсь прикрутить интерпретатор go. Пока не вышло, но идеи есть.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 27 фев 2016, 13:14

Удалось (пока руками) собрать интерпретатор go, который использует gccgo из тулчейна и собрать (после легих патчей) проект https://github.com/d0f/pwdgen (выбран наобум, из соображений - больше одного файла go) для mipsel.
На mipsel роутере бинарник работает. Есть одна проблема, не понимает клавишу Enter (печатает ^M), но вместо <Enter> можно нажать <Ctrl-J>.
Решил проверить, как pwdgen работает под Debian - и не смог собрать! :x
О языке GO я слышал, но стал о нем читать несколько дней назад. Если бы кто смог рассказать о GO подробнее (о том как все внутри устроено и работает) - было бы хорошо.
Как подступиться к Synthing - пока не знаю.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 28 фев 2016, 11:58

Научился собирать сложные проекты с помощью `go get`. Когда (если) закончу прикручивать go сборка бинарника будет выгдядеть так:

Код: Выделить всё

GOROOT=.... <и другие переменные> gcc=mipsel-openwrt-linux-gcc ogo get -x -compiler gccgo -gccgoflags '-Wl,--dynamic-linker=/opt/lib/ld-uClibc.so.0 -Wl,-rpath=/opt/bin'  github.com/jackpal/Taipei-Torrent
cd .
git clone https://github.com/jackpal/Taipei-Torrent <dir>
cd <dir>
git show-ref
cd <dir>
git checkout master
cd .
git clone https://github.com/jackpal/bencode-go <dir>
cd <dir>
.....
<тут выкачивание кучи пакетов, от которых зависят предыдущие>
....
WORK=/tmp/go-build507139738
mkdir -p $WORK/github.com/jackpal/bencode-go/_obj/
mkdir -p $WORK/github.com/jackpal/
cd <dir>
gccgo -I $WORK -c -g -fgo-pkgpath=github.com/jackpal/bencode-go -fgo-relative-import-path=_<dir>bencode-go -o $WORK/github.com/jackpal/bencode-go/_obj/_go_.o -Wl,--dynamic-linker=/opt/lib/ld-uClibc.so.0 -Wl,-rpath=/opt/bin ./decode.go ./parse.go ./struct.go
mkdir -p $WORK/github.com/jackpal/gateway/_obj/
cd <dir>
....
<тут компиляция go фалов с помощью gccgo 
....
cd .
gccgo -o $WORK/github.com/jackpal/Taipei-Torrent/_obj/exe/a.out $WORK/github.com/jackpal/Taipei-Torrent/_obj/_go_.o -Wl,-( <>/github.com/jackpal/Taipei-Torrent/libtorrent.a <>golang.org/x/net/libproxy.a <>....... -Wl,-E -Wl,-) -Wl,--dynamic-linker=/opt/lib/ld-uClibc.so.0 -Wl,-rpath=/opt/bin
mkdir -p <>/bin/
cp $WORK/github.com/jackpal/Taipei-Torrent/_obj/exe/a.out <>/bin/Taipei-Torrent

Тут ogo - специально собранный вариант go. Происходит скачивание go проектов, их компиляция и линковка. Результат копируется в папку <>/bin и переименовывается.
Бинарник торрент клиента собрался и работает. Правда медленно и пожирая кучу рамы

Код: Выделить всё

Mem: 116484K used, 9760K free, 20K shrd, 332K buff, 3948K cached
CPU:  25% usr  11% sys   0% nic   0% idle  62% io   0% irq   0% sirq
Load average: 1.26 0.95 1.80 2/57 1605
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
 1594  1504 admin    S     803m 652%  30% ./Taipei-Torrent -useDHT magnet:?xt=urn:btih:cdaa993d59a7192fc3ee63898de
  512     1 admin    S     1544   1%   3% /sbin/watchdog

Код: Выделить всё

2016/02/28 07:57:01 [ nnn.pdf ] Peers: 16 downloaded: 1802240 (16.00 kB/s) uploaded: 0 ratio: 0.000000 pieces: 839/1764
2016/02/28 07:57:02 [ nnn.pdf ] Have 840 of 1764 pieces 47.61905 % complete
2016/02/28 07:57:02 [ nnn.pdf ] Have 841 of 1764 pieces 47.675735 % complete
2016/02/28 07:57:02 [ nnn.pdf ] Peers: 16 downloaded: 1851392 (48.00 kB/s) uploaded: 0 ratio: 0.000000 pieces: 841/1764

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 01 мар 2016, 15:00

В нулевом варианте поддержка GO закончена. Все нужное пока в ветке go53.
Тут - https://github.com/Entware-ng/entware-go примеры Makefile для GO пакетов.
Все пока элементарно. Например, Makefile для пакета rclone (rclone - рабочий, проверял).

Код: Выделить всё

include $(TOPDIR)/rules.mk

PKG_NAME:=rclone
PKG_VERSION:=go
PKG_RELEASE:=1
PKG_GOGET:=github.com/ncw/rclone

include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/golang.mk

define Package/rclone
	SECTION:=Go
	CATEGORY:=Go
	DEPENDS:=+libgo +libpthread
	TITLE:=Rclone is a command line program to sync files and directories to and from cloud storages
	URL:=https://github.com/ncw/rclone
	MAINTAINER:=Entware team, http://entware.net
endef

define Package/rclone/description
 Rclone is a command line program to sync files and directories to and from:
    Google Drive
    Amazon S3
    Openstack Swift / Rackspace cloud files / Memset Memstore
    Dropbox
    Google Cloud Storage
    Amazon Cloud Drive
    Microsoft One Drive
    Hubic
    Backblaze B2
    Yandex Disk
    The local filesystem
endef

define Package/rclone/install
	$(INSTALL_DIR) $(1)/opt/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/rclone $(1)/opt/bin
endef

$(eval $(call BuildPackage,rclone))

Для сборки своего пакета, который можно собрать с помощью `go get` нужно создать Makefile и внем задать его имя (PKG_NAME), url (PKG_GOGET) и описания. Если нужно в папку patches можно положить патчи.

PS Не все собранные пакеты заработали. Не все можно собрать с помощью `go get`. Присоединяйтесь - работы еще много.

Аватара пользователя
Александр Рыжов
Сообщения: 443
Зарегистрирован: 12 авг 2015, 14:14
Откуда: Смоленск

Сообщение Александр Рыжов » 01 мар 2016, 16:34

Отлично!
Zyxmon писал(а):Источник цитаты Не все можно собрать с помощью `go get`. Присоединяйтесь - работы еще много.
Понятие версии в GO пошло погулять из-за принятой ими философии. Для того, чтобы пакет собирался сегодня, через месяц и через год в идеале надо придумать возможность «заморозки» исходников, хотя бы в рамках нашей папки sources.

-Wl,-rpath=/opt/bin — так и задумано?


Вернуться в «Собираем софт сами (пакеты, прошивки)»

Кто сейчас на конференции

Всего 0 посетителей :: 0 зарегистрированных, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей