Сборка Syncthing (GO) для entware-ng
-
- Сообщения: 10
- Зарегистрирован: 11 ноя 2015, 00:39
Здравствуйте.
Хочу собрать пакет 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
?
Я прочитал уже кучу инструкций и в результате имею кашу в голове. Прокомментируйте плз, выглядит ли здравым то, что я написал выше, и, если нет - куда копать?
Хочу собрать пакет 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
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
Собрать кросс-компилятор gccgo в случае системоной либы glibc оказалось не просто, а очень просто. Делал для архитектуры armv7. Нужно при сборке тулчейна (точнее для последнего этапа сборки gcc) добавить к строке TARGET_LANGUAGES в конце ",go". В результате будет собран кросскомпилятор go.
Собрал простейшую программу (Hello World):
с помощью
(тут в h.go - исходный код) и получил бинарник размером более 2МБ, который проработал на нужной архитектуре.
Для uclibc все несколько сложнее. Как минимум нужно портировать патч - https://git.uclibc.org/uClibc/commit/?i ... b1aafee4af в используемую uclibc-ng
Без этих функций точно gccgo собрать не удастся.
Собрал простейшую программу (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 собрать не удастся.
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
Совместно с Александр Рыжов выяснили, что uclibc-ng содержит нужные функции. Нужно в файле https://github.com/Entware-ng/Entware-n ... ommon#L227 их включить. Для сборки потребуется патч типа такого
https://gcc.gnu.org/ml/gcc-patches/2014 ... 00240.html
https://gcc.gnu.org/ml/gcc-patches/2014 ... 00240.html
-
- Сообщения: 10
- Зарегистрирован: 11 ноя 2015, 00:39
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
В ветке 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. Пока не вышло, но идеи есть.
Исправленный тулчейн, в нем собирается gccgo в том числе и для mipsel с uclibc-ng. Поскольку изменены конфиг uclibc и версия gcc (для go 1.4 нужен gcc 5.x), нужно пересобрать и переустановить системные либы. Это до конца не проверялось.
Конфиг для сборки - mipsel.config.52.
Теперь попытаюсь прикрутить интерпретатор go. Пока не вышло, но идеи есть.
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
Удалось (пока руками) собрать интерпретатор go, который использует gccgo из тулчейна и собрать (после легих патчей) проект https://github.com/d0f/pwdgen (выбран наобум, из соображений - больше одного файла go) для mipsel.
На mipsel роутере бинарник работает. Есть одна проблема, не понимает клавишу Enter (печатает ^M), но вместо <Enter> можно нажать <Ctrl-J>.
Решил проверить, как pwdgen работает под Debian - и не смог собрать!
О языке GO я слышал, но стал о нем читать несколько дней назад. Если бы кто смог рассказать о GO подробнее (о том как все внутри устроено и работает) - было бы хорошо.
Как подступиться к Synthing - пока не знаю.
На mipsel роутере бинарник работает. Есть одна проблема, не понимает клавишу Enter (печатает ^M), но вместо <Enter> можно нажать <Ctrl-J>.
Решил проверить, как pwdgen работает под Debian - и не смог собрать!

О языке GO я слышал, но стал о нем читать несколько дней назад. Если бы кто смог рассказать о GO подробнее (о том как все внутри устроено и работает) - было бы хорошо.
Как подступиться к Synthing - пока не знаю.
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
Научился собирать сложные проекты с помощью `go get`. Когда (если) закончу прикручивать go сборка бинарника будет выгдядеть так:
Тут ogo - специально собранный вариант go. Происходит скачивание go проектов, их компиляция и линковка. Результат копируется в папку <>/bin и переименовывается.
Бинарник торрент клиента собрался и работает. Правда медленно и пожирая кучу рамы
Код: Выделить всё
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
-
- Администратор
- Сообщения: 1911
- Зарегистрирован: 09 авг 2015, 15:33
В нулевом варианте поддержка GO закончена. Все нужное пока в ветке go53.
Тут - https://github.com/Entware-ng/entware-go примеры Makefile для GO пакетов.
Все пока элементарно. Например, Makefile для пакета rclone (rclone - рабочий, проверял).
Для сборки своего пакета, который можно собрать с помощью `go get` нужно создать Makefile и внем задать его имя (PKG_NAME), url (PKG_GOGET) и описания. Если нужно в папку patches можно положить патчи.
PS Не все собранные пакеты заработали. Не все можно собрать с помощью `go get`. Присоединяйтесь - работы еще много.
Тут - 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
- Откуда: Смоленск
Отлично!
-Wl,-rpath=/opt/bin — так и задумано?
Понятие версии в GO пошло погулять из-за принятой ими философии. Для того, чтобы пакет собирался сегодня, через месяц и через год в идеале надо придумать возможность «заморозки» исходников, хотя бы в рамках нашей папки sources.Zyxmon писал(а):Источник цитаты Не все можно собрать с помощью `go get`. Присоединяйтесь - работы еще много.
-Wl,-rpath=/opt/bin — так и задумано?
Вернуться в «Собираем софт сами (пакеты, прошивки)»
Кто сейчас на конференции
Всего 1 посетитель :: 1 зарегистрированный, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33
Сейчас этот форум просматривают: CommonCrawl [Bot] и 0 гостей