Forum Turris
Fórum Turris Nápověda

Milí majitelé routerů Turris,

toto fórum bylo 9. 12. 2016 zmrazeno a nahrazeno naším novým Turris fórem. Ještě chvíli bude dostupné k prohlížení, ale již zde není možné přispívat. Více informací naleznete v oznámení o uzavření fóra.


Dear Turris routers users,

this forum has been frozen on Dec 9th, 2016 and replaced by our new Turris forum. It will be read-only accessible for some time after. For more information, read the announcement about closing the forum.

Nahoru Téma Majitelé routerů / Uživatelská vylepšení / Unison File Synchronizer
- - Od jirig Dne 2014-04-26 13:17 Upraveno 2016-03-13 13:58 Hlasů 1
Zdá se, že jedním z oblíbených vylepšení Turrisu bude připojení disku a využití jako NAS. Protože Turris je z podstaty věci neustále připojen k internetu, nabízí se i využití k synchronizaci dat ve více počítačích na různých místech. Já k tomuto účelu používám s úspěchem už řadu let program Unison -- pro seznámení viz například článek na AbcLinuxu.

Zprovoznit Unison není úplně jednoduché, protože je napsaný ve funkcionálním jazyce OCaml a ani Unison ani Ocaml nejsou systémem OpenWRT přímo podporovány. Nabízí se několik možných strategií.

A. Zkompilovat OCaml a pomocí něj Unison přímo na Turrisu.

Toto by byl asi nejjednodušší způsob, kdyby existoval balíček s kompilátorem GCC. Protože většina routerů není příliš výkonná, podobný balíček k dispozici není. Vývojové prostředí OpenWRT je poměrně složité a používá upravenou verzi GCC, takže touto cestou jsem se nepouštěl. Nicméně, kdyby někdo návod na vytvoření balíčku s nativním kompilátorem dokázal sepsat, mohlo by se to hodit i v další případech, kdy kompilace nějakého programu není úplně přímočará.

B. Vytvořit křížový kompilátor OCaml pro architekturu PowerPC a tím zkompilovat Unison, který poběží na Turrisu.

Toto by byl nejefektivnější způsob, protože výsledkem by byl přímo nativní program pro architekturu Turrisu. I když křížová kompilace není pro OCaml přímo podporována, existuje pro tuto funkci poměrně jednoduchý patch. Bohužel, výsledný program skončí ihned po spuštění na Illegal instruction, i když kód asembleru, který OCaml vygeneroval, přeložil křížový kompilátor GCC bez potíží. Nevím, zda někde dělám chybu nebo Ocaml prostě nedokáže generovat kód pro hardware Turrisu. Kdyby to někdo dokázal prozkoumat, můžu popsat svůj postup.

C. Vytvořit interpret OCaml pro Turris, na kterém poběží do bytekódu přeložený Unison.

Tuto variantu popisuje následující návod. Nevýhodou je poměrně složitá kompilace, větší výsledný spustitelný soubor a hlavně pomalejší běh Unisonu. Nicméně, používal jsem takto vytvořenou verzi i na mnohem méně výkonném NASu DNS-323 na synchronizaci úložiště velikého stovky gigabajtů a obsahujícího statisíce souborů řadu let bez větších obtíží.

Následující návod je poměrně podrobný a jeho cílem je spíše vysvětlit, jak dosáhnout výsledku, než poskytnout sadu příkazů, které je možné bez rozmyslu zkopírovat. Je to i proto, že s malými úpravami se může hodit majitelům jiných hardwarových zařízení.

EDIT: Pan Marián Kyral popsal níže v diskuzi postup, jak Unison zkompilovat pomocí standardních mechanismů pro tvorbu balíčků v OpenWRT. Jde o podstatně jednodušší způsob, než je ruční postup popisovaný v mém návodu.

Při používání Unisonu se doporučuje, aby na serveru i klientech běžela stejná verze programu. Postup předvádím na starší verzi (2.40.63) Unisonu, protože ji zatím pro některé klienty potřebuji. Ověřil jsem však, že stejným postupem lze zprovoznit i nejnovější stabilní verzi (2.40.102). Existují i novější verze OCaml (řady 4.00 a 4.01), s kterými však nemám zkušenosti a s jejichž pomocí starší verze Unisonu zkompilovat nejdou.

Kvůli omezení na maximální délku příspěvku uvedu jednotlivé kroky postupu v samostatných příspěvcích. Usnadní to i případné dotazy nebo připomínky.
Nadřazený - Od jirig Dne 2014-04-26 13:18
0. Přípravné práce

Výsledný Unison má sice velikost asi 3,5 MB, pro jeho vytvoření však bude potřeba zhruba 4 GB volného místa na disku (a i jinak půjdeme dost s kanónen na vrabce).

Čas potřebný pro kompilaci závisí hlavně na výkonu procesoru, na slabších strojích to může být i několik hodin, ale většinu této doby bude počítač pracovat sám a nijak se mu věnovat nemusíme.

V systému musí být nainstalovaný kompilátor GCC a další obvyklé vývojové nástroje. Tohle je hodně závislé na linuxové distribuci a jejím systému pro správu balíčků (takže zde žádný konkrétní postup nejsem schopný poskytnout).

Na Turris je potřeba pomocí webového rozhraní nebo opkg nainstalovat ze standardní distribuce balíček libncurses.

Vytvoříme si adresář, v kterém se celé naše snažení bude odehrávat.

mkdir turris
cd turris/
export TURRIS=$PWD


V mém případě je to /home/jirig/turris. V některých výpisech budou použity plné cesty, tak ať poznáme, co je specificky moje konfigurace a co součást obecného postupu.

Stáhneme si zdrojové kódy pro Unison a OCaml.

wget 'http://www.seas.upenn.edu/~bcpierce/unison/download/releases/unison-2.40.63/unison-2.40.63.tar.gz'
wget 'http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz'
Nadřazený - - Od jirig Dne 2014-04-26 13:19
1. Křížový kompilátor

V tomto kroku vytvoříme tzv. křížový kompilátor (cross compiler), který poběží na našem hostitelském počítači, ale bude schopný vytvářet binární kód pro hardware routeru. Hostitelský počítač může být například 64-bitový i686, zatímco Turris je 32-bitový ppc (PowerPC). Z hlediska časové náročnosti je toto nejdelší krok.

cd $TURRIS

Nejprve si stáhneme verzi OpenWRT použitou v projektu Turris.

git clone --depth 1 https://gitlab.labs.nic.cz/turris/openwrt.git
cd openwrt/


Protože OpenWRT je obecný systém pro mnoho různých zařízení, je potřeba ho nejdříve nakonfigurovat. Pro naše účely bohatě postačí nastavení připravené autory Turrisu.

cp -f configs/config-turris-nand .config
make defconfig


Při této příležitosti dojde ke kontrole, zda máme v systému všechny balíčky nutné k vytvoření kompilátoru.

Nyní zkompilujeme nástroje potřebné pro vytvoření kompilátoru a následně kompilátor spolu se základními knihovnami. Tohle bude trvat docela dlouho.

make tools/install
make toolchain/install


Povšimněte si, že se kompilátor (GCC) a knihovna jazyka C (uClibc) kompilují několikrát. Je to sice na dlouhé lokte, ale jinak je to obvyklý způsob, jak zajistit, že výsledek bude zcela odstíněn od prostředí našeho počítače.

Kromě kompilátoru toho budeme v následujících krocích potřebovat také knihovnu NCurses, takže ji rovněž připravíme, to už bude jen chvilka.

make package/ncurses/install

Důležité je ještě vědět, kde se nacházejí výsledky naší dosavadní práce. Cesty nejsou zrovna přehledné, takže si je pro budoucí použití uložíme pro proměnných.

export TURRIS_TOOLCHAIN=$TURRIS/openwrt/staging_dir/toolchain-powerpc_8540_gcc-4.6-linaro_uClibc-0.9.33.2
export TURRIS_NATIVE=$TURRIS/openwrt/staging_dir/target-powerpc_8540_uClibc-0.9.33.2


Cesty obsahují čísla verzí některých klíčových komponent systému, takže v novějších verzích OpenWRT se můžou lišit. Co by mělo zůstat stejné je powerpc_8540, které určuje hardwarovou platformu Turrisu.

První cesta vede k programům zkompilovaným pro platformu počítače, na kterém pracujeme. Příkaz
file $TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc
vypíše v mém případě
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.13.5, not stripped
ale jiní lidé uvidí jiné informace.

Naproti tomu druhá cesta vede k programům určeným pro Turris. Odtud se berou soubory, z kterých se vytvářejí balíčky, které potom instalujeme na naše routery. Příkaz
file $TURRIS_NATIVE/usr/lib/libncurses.so.5.9
by proto měl všem stejně vypsat
ELF 32-bit MSB shared object, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, not stripped
což je přesně to, čeho jsme se snažili dosáhnout. Jen pozor, koncovka .5.9 se u jiných verzí OpenWRT případnou novějších verzí knihovny NCurses může změnit.

Křížový kompilátor potřebuje vědět, kde se nativní knihovny (jako je naše NCurses) nacházejí, a očekává, že se to dozví z proměnné STAGING_DIR (viz soubor $TURRIS_TOOLCHAIN/lib/gcc/powerpc-openwrt-linux-uclibcspe/4.6.4/specs). Tohle normálně nějak zajišťuje poměrně složitá mašinerie určená pro kompilaci balíčků v rámci OpenWRT. My ji však pro zjednodušení :smile: nevyužijeme, první část postupu proto dokončíme ručním nastavením zmiňované proměnné.

export STAGING_DIR=$TURRIS_NATIVE

Mimochodem, při kompilaci došlo ke stažení potřebných balíčků se zdrojovými kódy (zhruba 230 MB). Uložily se do podadresáře dl, takže kdybyste si v rámci nějakých nepodařených experimentů stahovali z Cz.nicu čistou verzi OpenWRT, je možné je zkopírovat a ušetřit trochu času.
Nadřazený - - Od Eskymák (>) Dne 2014-05-19 12:15
Hoj, na jakým systému pracuješ? Já na debianu 7 x64 a končím v polovině 1. části a to na chybějícím ncurses and gawk.  Rád bych si pomocí návodu skompiloval vlastní aplikaci ale bohužel se nedostanu ani k tvé původní části, kterou si mohu přiohnout dle svého. Nějakej nápad? Dík

eskymak@vm:~$ mkdir turris
eskymak@vm:~$ cd turris/
eskymak@vm:~/turris$ export TURRIS=$PWD
eskymak@vm:~/turris$ cd $TURRIS
eskymak@vm:~/turris$ git clone --depth 1 https://gitlab.labs.nic.cz/turris/openwrt.git
Cloning into 'openwrt'...
remote: Counting objects: 6616, done.
remote: Compressing objects: 100% (5551/5551), done.
remote: Total 6616 (delta 1175), reused 4287 (delta 567)
Receiving objects: 100% (6616/6616), 8.89 MiB | 623 KiB/s, done.
Resolving deltas: 100% (1175/1175), done.
eskymak@vm:~/turris$ cd openwrt/
eskymak@vm:~/turris/openwrt$ cp -f configs/config-turris-nand .config
eskymak@vm:~/turris/openwrt$ make defconfig
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
Checking 'working-g++'... ok.
Checking 'ncurses'... failed.
Checking 'zlib'... ok.
Checking 'gawk'... failed.
Checking 'unzip'... ok.
Checking 'bzip2'... ok.
Checking 'perl'... ok.
Checking '/usr/bin/python2.7'... ok.
Checking 'wget'... ok.
Checking 'git'... ok.
Checking 'gnutar'... ok.
Checking 'svn'... ok.
Checking 'openssl'... ok.
Checking 'gnu-find'... ok.
Checking 'getopt-extended'... ok.
Checking 'non-root'... ok.

Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)
Build dependency: Please install GNU awk.

Prerequisite check failed. Use FORCE=1 to override.
make: *** [tmp/.prereq-build] Error 1
eskymak@vm:~/turris/openwrt$ make tools/install
Collecting package info: done
Collecting target info: done
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
Checking 'working-g++'... ok.
Checking 'ncurses'... failed.
Checking 'zlib'... ok.
Checking 'gawk'... failed.
Checking 'unzip'... ok.
Checking 'bzip2'... ok.
Checking 'perl'... ok.
Checking '/usr/bin/python2.7'... ok.
Checking 'wget'... ok.
Checking 'git'... ok.
Checking 'gnutar'... ok.
Checking 'svn'... ok.
Checking 'openssl'... ok.
Checking 'gnu-find'... ok.
Checking 'getopt-extended'... ok.
Checking 'non-root'... ok.

Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)
Build dependency: Please install GNU awk.

Prerequisite check failed. Use FORCE=1 to override.
make[1]: *** [tmp/.prereq-build] Error 1
make: *** [tools/install] Error 2
eskymak@vm:~/turris/openwrt$ make toolchain/install
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
Checking 'working-g++'... ok.
Checking 'ncurses'... failed.
Checking 'zlib'... ok.
Checking 'gawk'... failed.
Checking 'unzip'... ok.
Checking 'bzip2'... ok.
Checking 'perl'... ok.
Checking '/usr/bin/python2.7'... ok.
Checking 'wget'... ok.
Checking 'git'... ok.
Checking 'gnutar'... ok.
Checking 'svn'... ok.
Checking 'openssl'... ok.
Checking 'gnu-find'... ok.
Checking 'getopt-extended'... ok.
Checking 'non-root'... ok.

Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)
Build dependency: Please install GNU awk.

Prerequisite check failed. Use FORCE=1 to override.
make[1]: *** [tmp/.prereq-build] Error 1
make: *** [toolchain/install] Error 2
eskymak@vm:~/turris/openwrt$ make package/ncurses/install
Checking 'working-make'... ok.
Checking 'case-sensitive-fs'... ok.
Checking 'getopt'... ok.
Checking 'fileutils'... ok.
Checking 'working-gcc'... ok.
Checking 'working-g++'... ok.
Checking 'ncurses'... failed.
Checking 'zlib'... ok.
Checking 'gawk'... failed.
Checking 'unzip'... ok.
Checking 'bzip2'... ok.
Checking 'perl'... ok.
Checking '/usr/bin/python2.7'... ok.
Checking 'wget'... ok.
Checking 'git'... ok.
Checking 'gnutar'... ok.
Checking 'svn'... ok.
Checking 'openssl'... ok.
Checking 'gnu-find'... ok.
Checking 'getopt-extended'... ok.
Checking 'non-root'... ok.

Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)
Build dependency: Please install GNU awk.

Prerequisite check failed. Use FORCE=1 to override.
make[1]: *** [tmp/.prereq-build] Error 1
make: *** [package/ncurses/install] Error 2
eskymak@vm:~/turris/openwrt$
Nadřazený - - Od jirig Dne 2014-05-19 12:37
Já nepoužívám žádnou distribuci, takže přesné detaily neznám. Ale všechny nutné věci by měly jít naistalovat jako standardní balíček. Jen to občas bývá rozdělené na základní balíček s věcmi potřebnými k běhu a část potřebnou jen pro vývojáře, která mívá v názvu dev nebo devel.

Zkusil jsem krátce hledat na internetu a tohle by mohly být potřebné balíčky:
https://packages.debian.org/wheezy/gawk
https://packages.debian.org/wheezy/libncurses5-dev
Nadřazený - - Od Eskymák (>) Dne 2014-05-20 22:13
Díky,

už mám na Turrisu Hello World ;)
Nadřazený - - Od jirig Dne 2014-05-21 10:41
Výborně :smile:

Koukal jsem, co by se s tím OpenTTD dalo dělat dále, abyste příliš netápal. Neměl jsem na to moc času, ale tady jsou nějaké informace, které by vás mohly nasměřovat.

Nejprve do cesty přidejte umístění křížového kompilátoru:

PATH=$TURRIS_TOOLCHAIN/bin:$PATH

Pak je potřeba správně spustit konfigurační skript:

CC=powerpc-openwrt-linux-gcc CXX=powerpc-openwrt-linux-g++ ./configure \
--build=i686-pc-linux-gnu --host=powerpc-openwrt-linux-uclibcspe \
--prefix-dir=/sd --enable-dedicated \
--without-zlib --without-liblzma --without-liblzo2 --without-png --without-xdg-basedir


K jednotlivým položkám:

- CC a CXX jsou názvy spustitelných souborů křížového kompilátoru
- build=i686-pc-linux-gnu je platforma, na které kompilujete, já jsem vzal prefix svého kompilátoru GCC
- host=powerpc-openwrt-linux-uclibcspe je celý název platformy turrisu (powerpc-openwrt-linux je jen zkratka)
- prefix-dir=/sd je místo, kde to na Turrisu bude uložené
- enable-dedicated znamená, že chcete pouze server -- alespoň doufám :wink:
- without-* zakazuje linkování s knihovnami, které je to schopné najít na mém počítači

Některé z těch knihoven asi nakonec budete potřebovat, k tomu se případně ještě vrátíme.

Jestli konfigurace proběhla správně, kompilaci spustíte standardně:

make

U mne to po čase skončilo s chybou, nebyl nalezen hlavičkový soubor execinfo.h. To je nějaká součást systémové knihovny Glibc, která na Turrisu skutečně není. Její použití je závislé na definici symbolu __GLIBC__. Moc se mi nechtělo zkoumat, odkud se bere, tak jsem ho ve zdrojových souborech OpenTTD zkusil prostě přejmenovat, a pak už mi kompilace proběhla celá:

for f in src/network/core/os_abstraction.h src/os/unix/unix.cpp src/os/unix/crashlog_unix.cpp ; do
    sed -i.bak 's/__GLIBC__/__NOGLIBC__/g' $f
done


Nakonec ještě všechno nainstalujeme do adresáře, odkud to jde zabalit a nahrát na router:

make INSTALL_DIR=$TURRIS install

Kompilace byla úspěšná v tom smyslu, že výsledný binární soubor jde na Turrisu spustit. Jen možná budete muset doinstalovat balíček libstdcpp, což je standardní knihovna jazyka C++ (zdá se, že jinak si Turris vystačí s programy v C). Nakolik to funguje, jak má, to ovšem jako nehráč neposoudím.
Nadřazený - Od Eskymák (>) Dne 2014-05-22 00:12
Zkompilováno!

include <execinfo.h> jsem zakomentoval
__GLIBC__ je v souboru všeho všudy jednou, takže ručně přejmenováno
Na potřebu libstd jsem byl při spuštění upozorněn, takže jsem doinstaloval :-)
Knihovny by potřeba být neměly, slouží především pro zpracování savů, uvidíme

Jediný, co mě na chvíli zdrželo bylo, že si systém nepamatoval nastavené cesty z minula (pro mne překvapení), takže mě pak mi to pochopitelně hlásilo, že to nemůže něco nalézt. :surprised: Jinak šlo vše hladce!

Po spuštění openttd kříčí
Error: No available language packs (invalid versions?)

S tím už ale budu muset na openttd forum a pak dám vědět :-)

Díky moc, ani jsem nečekal návod krok za krokem. Věřím, že se bude hodit i na další aplikace, nejen mě :-)

Jsem rád, že jsem původně nepostupoval tak moc špatně, jen mi chybělo všechno okolo Turrisu. :grin:
Nadřazený - Od jirig Dne 2014-04-26 13:19
2. Otestování křížového kompilátoru

Tento krok je nepovinný a je určený pro ty, kteří jsou zvědaví, jak věci fungují, nebo si chtějí ověřit, že předchozí krok proběhl správně.

cd $TURRIS

Vytvoříme si jednoduchý program v jazyce C.

cat > hello.c << "EOF"
#include <stdio.h>

main()
{
  printf("Hello world\n");
}
EOF


Kompilátorem z kroku 1 ho křížově zkompilujeme pro Turris.

$TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc -o hello-c hello.c

Provedeme rychlou kontrolu
file hello-c
a měli bychom obdržet
ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
což odpovídá očekávání, i když se výpis trochu liší od toho v předchozím kroku (protože tam jsme neměli k dispozici žádný spustitelný soubor, takže jsme testovali knihovnu).

Když teď soubor hello-c nahrajeme na router a na příkazové řádce ho spustíme, úslužně vypíše požadované Hello world, i když vznikl v dočista jiném prostředí, než běží. Mně to přijde jako hezké kouzlo.
Nadřazený - Od jirig Dne 2014-04-26 13:20 Upraveno 2014-04-26 13:40
3. OCaml pro počítač

Tohle by měl být úplně jednoduchý krok. Vytvoříme verzi OCaml spustitelnou na našem počítači a nainstaluje ji do podadresáře host.

Rozbalíme zdrojové kódy.

cd $TURRIS
mkdir ocaml-host
tar xf ocaml-3.12.1.tar.gz -C ocaml-host --strip-components=1
cd ocaml-host/


Spustíme automatickou konfiguraci.

sed -i.bak 's/otherlibraries graph/otherlibraries/' configure
./configure -prefix $TURRIS/host --no-tk


Úvodní sed pouze zajistí vynechání kompilace grafické knihovny, takže kompilace proběhne o něco rychleji a nebudeme závislí na přítomnosti X Windows. Nic zásadního to neovlivňuje, podobně jako volba --no-tk u konfiguračního skriptu, která vynechá vazbu na TCL GUI Toolkit.

Zkompilujeme.

make world

A nainstalujeme.

make install

O správnosti architektury se můžeme přesvědčit obvyklým způsobem
file $TURRIS/host/bin/ocamlrun
Nadřazený - Od jirig Dne 2014-04-26 13:20
4. OCaml pro router

Nyní nástroje připravené v 1. a 3. kroku využijeme pro vytvoření verze OCaml, která by byla schopná běžet na routeru. Tento krok je pravděpodobně nejsložitější a vyžaduje trochu pečlivosti (jako ostatně každá magie).

Rozbalíme zdrojové kódy.

cd $TURRIS
mkdir ocaml-powerpc
tar xf ocaml-3.12.1.tar.gz -C ocaml-powerpc --strip-components=1
cd ocaml-powerpc/


Konfigurace nyní nemůže proběhnout automaticky, protože konfigurační skript zjišťuje některé parametry systému, na kterém běží, a dělá to tak, že zkompiluje a spustí řadu malých testovacích programů v C. Výsledky se zapíší do souborů config/m.h a config/s.h, které ovlivňují následnou kompilaci.

Tyto soubory lze vytvořit editací komentovaných šablon v souborech config/m-templ.h a config/s-templ.h. My však využijeme skutečnosti, že spouštění testovacích programů řídí skript config/auto-aux/runtest a vytvoříme si za něj náhradu, která bude správné výsledky hlásit rovnou, aniž by spouštěla nějaké testovací programy.

mv config/auto-aux/runtest config/auto-aux/runtest.orig
cat > config/auto-aux/runtest << "EOF"
#!/bin/sh

output=""
ret=0

case $(basename $1 .c) in

    ansi)       ;;
    async_io)   ;;
    dblalign)   ;;
    divmod)     ;;
    endian)     ;;
    getgroups)  ;;
    initgroups) ;;
    int64align) ;;
    longlong)   ;;
    setgroups)  ;;
    signals)    ;;
    sizes) output="4 4 4 2" ;;

    *) echo $0: unexpected test $1 1>&2
   exit 99
esac

[ "$output" ] && echo "$output"
exit $ret
EOF
chmod 755 config/auto-aux/runtest


Kdyby někdo potřeboval zjistit výsledky pro jinou architekturu (například zmiňovaný DNS-323 s architekturou ARM musí pro případ endian skončit návratovou hodnotu 1), lze testovací programy křížově zkompilovat podobně jako program v 2. bodu tohoto návodu a ručně spustit na cílovém zařízení. Výsledky se postupně ukládají do souboru config/m.h a průběh některých testů závisí na výsledku těch předchozích, je proto dobré ručně sledovat logiku z konfiguračního skriptu (řádky 337 až 506).

Co se souboru config/s.h týče, zatím mi vždy fungoval ten vygenerovaný konfiguračním skriptem. Nemá-li váš systém příliš neobvyklá systémová volání, mělo by to fungovat také.

Kromě toho ještě musíme konfiguračnímu skriptu říci, pro jakou platformu chceme OCaml kompilovat a předat mu cesty ke kompilátoru a asembleru pro tuto platformu, v tomto případě k našemu křížovému kompilátoru.

sed -i.bak 's/otherlibraries graph/otherlibraries/' configure
./configure \
    -prefix $TURRIS/powerpc \
    --no-tk \
    -host powerpc-uclibc-linux \
    -cc $TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-gcc \
    -aspp "$TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-gcc -c" \
    -as $TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-as


Nyní můžeme spustit kompilaci.

make world

Ale je potřeba počítat s tím, že po chvíli skončí s chybou, jejíž podstatou je sdělení
boot/ocamlrun: cannot execute binary file

Provedeme-li kontrolu
file boot/ocamlrun
zjistíme, že stížnost je oprávněná, neboť jde o program pro platformu routeru, takže na hostitelském počítači skutečně spustit nejde.

Potíž je v tom, že OCaml je programovací jazyk a jak bývá v takových případech dobrým zvykem, většina je ho napsaná v tomto jazyce samotném. Při kompilaci vznikne proto nejdříve malý interpret a generátor parserů, které jsou napsané v jazyce C (adresáře byterun a yacc) a skončí v adresáři boot. Protože jsme však konfiguračnímu skriptu podsunuli křížový kompilátor, nejdou samozřejmě použít.

Pomůžeme si snadno a přepíšeme tyto omezené pomocné verze plnými verzemi, které jsme si pro naši platformu vytvořili v předchozím kroku.

cp -f $TURRIS/host/bin/{ocamlrun,ocamlyacc} boot/

OCaml je však pečlivý a tyto soubory si vždy přepíše verzemi, které si sám vytvořil, takže mu v tom ještě musíme zabránit a příslušné příkazy (řádky 190 a 192 v Makefile) zakomentovat.

sed -i.bak -e '190s/^/#/' -e '192s/^/#/' Makefile

Nyní můžeme opět spustit kompilaci.

make world

Kompilace nyní dvakrát po sobě skončí s chybou
Error on dynamically loaded library
což souvisí s tím, že OCaml se snaží prostřednictvím interpretu, který jsme mu podsunuli, vyvolat kompilátor pro naši platformu a s ním linkovat s knihovnou pro platformu routeru. Oba případy vyřešíme tak, že knihovnu pro cílovou platformu zazálohujeme a podsuneme knihovnu pro platformu našeho počítače, aby kompilace mohla pokračovat.

I. Error: Error on dynamically loaded library: ../otherlibs/unix/dllunix.so: ../otherlibs/unix/dllunix.so: ELF file data encoding not little-endian

mv otherlibs/unix/dllunix.so otherlibs/unix/dllunix.so.target
cp $TURRIS/host/lib/ocaml/stublibs/dllunix.so otherlibs/unix/
make world


II. Error: Error on dynamically loaded library: ../otherlibs/str/dllcamlstr.so: ../otherlibs/str/dllcamlstr.so: ELF file data encoding not little-endian

mv otherlibs/str/dllcamlstr.so otherlibs/str/dllcamlstr.so.target
cp $TURRIS/host/lib/ocaml/stublibs/dllcamlstr.so otherlibs/str/
make world


Nyní by konečně kompilace měla doběhnout bez chyby a obě knihovny můžeme vrátit na své místo.

mv -f otherlibs/unix/dllunix.so.target otherlibs/unix/dllunix.so
mv -f otherlibs/str/dllcamlstr.so.target otherlibs/str/dllcamlstr.so


Z nějakého důvodu neproběhla správně kompilace programu ocaml, což je interaktivní rozhraní k interpretu jazyka. Protože ho však k ničemu nepotřebujeme, nebudeme to vůbec zkoumat, a vytvoříme za něj minimální nefunkční náhražku.

touch ocaml

Konečně můžeme provést instalaci.

make install

O správnosti architektury se můžeme přesvědčit jako obyčejně
file $TURRIS/powerpc/bin/ocamlrun

Tato verze OCaml by v principu šla nahrát na Turris a spustit tam. K provozování Unisonu ji však nepotřebujeme a k jeho kompilaci nestačí, takže k tomu celkem není žádný důvod.
Nadřazený - Od jirig Dne 2014-04-26 13:21
5. Otestování OCaml

Tento krok je opět nepovinný a je určený pro ty, kdo chtějí vědět, jak celý ten cirkus funguje dohromady, nebo si ověřit, že všechno zvládli správně.

cd $TURRIS

Vytvoříme si jednoduchý program pro OCaml.

cat > hello.ml << "EOF"
print_string "Hello world\n";;
EOF


Nejdříve ho necháme zkompilovat pro náš počítač. Za normálních okolností by vznikl bytekód, který by se spouštěl s použitím programu ocamlrun. My však pomocí přepínače -custom požádáme o vytvoření soběstačné verze, jejíž běh už prostředí OCaml potřebovat nebude (o to nám na routeru půjde). Pomocí -verbose ještě požádáme OCaml kompilátor, aby nám řekl, co při tom vlastně dělá.

host/bin/ocamlc -custom -verbose -o hello-ml hello.ml

Výsledek je docela zajímavý.

+ gcc -o 'hello-ml'   '-L/home/jirig/turris/host/lib/ocaml'  '/tmp/camlprim18dff4.c' '-lcamlrun' -I'/home/jirig/turris/host/lib/ocaml' -lm  -ldl -lncurses -lpthread

Vidíme, že se spustil kompilátor GCC, co má přeložit kód v C, který OCaml vygeneroval do adresáře /tmp (jméno souboru bude pokaždé jiné) a v kterém je funkce našeho programu. Přitom se mohou použít hlavičkové soubory (.h) jazyka C z adresáře $TURRIS/host/lib/ocaml. K výsledku se přilinkuje statická knihovna libcamlrun.a z $TURRIS/host/lib/ocaml, dynamické systémové knihovny (m, dl, pthread) a dynamická NCurses. Dynamické knihovny jsou brané z míst, která jsou v systému standardní.

Výsledkem je běžný spustitelný program
file hello-ml
pro platformu našeho počítače
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.13.5, not stripped
který už OCaml k fungování nepotřebuje.

Správný kompilátor GCC nastavíme parametrem -cc. Pomocí parametru -I určíme, kde se má hledat knihovna libcamlrun.a. O dynamické knihovny se postará GCC (o systémové samo, o NCurses díky nastavení proměnné STAGING_DIR). Hlavičkové soubory ošetříme s pomocí parametru -ccopt podsunutím parametru -I kompilátoru GCC. Verzi pro Turris tak vytvoříme následujícím příkazem.

host/bin/ocamlc -custom -verbose -o hello-ml hello.ml \
    -cc $TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc \
    -I $TURRIS/powerpc/lib/ocaml \
    -ccopt '-I./powerpc/lib/ocaml'


Podle výstupu to už vypadá nadějně, i když je jednou tak dlouhý a nepříliš přehledný.

+ /home/jirig/turris/openwrt/staging_dir/toolchain-powerpc_8540_gcc-4.6-linaro_uClibc-0.9.33.2/bin/powerpc-openwrt-linux-uclibcspe-gcc -o 'hello-ml'   '-L/home/jirig/turris/powerpc/lib/ocaml' '-L/home/jirig/turris/host/lib/ocaml' -I./powerpc/lib/ocaml '/tmp/camlprimfe2ed6.c' '-lcamlrun' -I'/home/jirig/turris/host/lib/ocaml' -lm  -ldl -lncurses -lpthread

Obvyklý rychlý test také dopadne dobře
file hello-ml
a vypíše očekávané a dobře známe
ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
takže už zbývá jen hello-ml zkopírovat na Turris a zkusit spustit.

Je-li na serveru nainstalovaný balíček ldd, můžeme se ještě následujícím způsobem přesvědčit o dynamických knihovnách (ldd z mého počítače si s formátem pro odlišnou architekturu neporadí).

ldd ./hello-ml

Uvidíme zhruba toto.

libm.so.0 => /lib/libm.so.0 (0x48018000)
libdl.so.0 => /lib/libdl.so.0 (0x48038000)
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x4804c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x48097000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x480bb000)
libc.so.0 => /lib/libc.so.0 (0x480e5000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x48000000)


K přípravě spustitelného programu jsme sice tyto knihovny při linkování potřebovali i na našem počítači (proto jsem kompilovali NCurses), ale součástí programu samotného nejsou, při spuštění se vezmou verze na Turrisu (proto se jim říká dynamické a proto jsme na router museli NCurses doinstalovat jako standardní balíček, i když jsme je sami kompilovali). Naproti tomu běhové prostředí pro OCaml, které je v knihovně camlrun, součástí programu je (proto se jí říká statická a  proto je také hello-ml tak velký).

Ty opravdu těžké věci tímto máme za sebou. Očekává nás sice ještě jedna drobná peripetie, ale už jsme skoro u cíle.
Nadřazený - Od jirig Dne 2014-04-26 13:21
6. Unison File Synchronizer

Nyní už máme všechny nástroje k tomu, abychom dokázali zkompilovat Unison spustitelný na routeru Turris.

Rozbalíme zdrojové kódy.

cd $TURRIS
tar xf unison-2.40.63.tar.gz
cd unison-2.40.63/


Nejprve zkompilujeme Unison pro hostitelský počítač.

PATH=$TURRIS/host/bin:$PATH make UISTYLE=text NATIVE=false

Na začátek seznamu cest, kde se hledají spustitelné programy, jsme dočasně přidali umístění OCaml (PATH). Unison kompilujeme jen s textovým rozhraním (UISTYLE), protože bude fungovat hlavně jako server (a na Turrisu stejně nemáme k dispozici TCL/TK a X Windows). Protože naše OCaml není schopno vytvářet přímo kód pro platformu PowerPC, kompilujeme pouze do bytekódu (NATIVE).

Kompilace by měla proběhnout hladce (možná až na závěrečnou stížnost o nenalezení programu etags, kterou je možné ignorovat přesně tak, jak výpis navrhuje). Náš test
file unison
ukáže (na mojí platformě) očekávané
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.13.5, not stripped

Oproti kompilaci testovacího programu v předchozím bodě přináší Unison jednu komplikaci. Ve skutečnosti totiž není napsaný celý v OCaml, několik částí je i v jazyce C.

Přesvědčíme se o tom takto.

file *.o

A toto jsou potížisté.

bytearray_stubs.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
osxsupport.o:      ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
pty.o:             ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped


Na konci výpisu z kompilace Unisonu vidíme, jak vznikli.

ocamlc -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/osxsupport.o -c /home/jirig/turris/unison-2.40.63/osxsupport.c
ocamlc -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/pty.o -c /home/jirig/turris/unison-2.40.63/pty.c
ocamlc -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/bytearray_stubs.o -c /home/jirig/turris/unison-2.40.63/bytearray_stubs.c


Přidáme k těmto příkazům parametr -verbose, doplníme na začátek správnou cestu a znovu je spustíme.

$TURRIS/host/bin/ocamlc -verbose -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/osxsupport.o -c /home/jirig/turris/unison-2.40.63/osxsupport.c
$TURRIS/host/bin/ocamlc -verbose -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/pty.o -c /home/jirig/turris/unison-2.40.63/pty.c
$TURRIS/host/bin/ocamlc -verbose -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -ccopt "-o "/home/jirig/turris/unison-2.40.63/bytearray_stubs.o -c /home/jirig/turris/unison-2.40.63/bytearray_stubs.c


Dozvíme se, co se ve skutečnosti děje.

+ gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o /home/jirig/turris/unison-2.40.63/osxsupport.o '-Ilwt' '-Iubase' '-Isystem' '-Isystem/generic' '-Ilwt/generic' -I'/home/jirig/turris/host/lib/ocaml' '/home/jirig/turris/unison-2.40.63/osxsupport.c'
+ gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o /home/jirig/turris/unison-2.40.63/pty.o '-Ilwt' '-Iubase' '-Isystem' '-Isystem/generic' '-Ilwt/generic' -I'/home/jirig/turris/host/lib/ocaml' '/home/jirig/turris/unison-2.40.63/pty.c'
+ gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o /home/jirig/turris/unison-2.40.63/bytearray_stubs.o '-Ilwt' '-Iubase' '-Isystem' '-Isystem/generic' '-Ilwt/generic' -I'/home/jirig/turris/host/lib/ocaml' '/home/jirig/turris/unison-2.40.63/bytearray_stubs.c'


Celkem snadno tak tyto části můžeme zkompilovat správným způsobem. Stačí použít náš křížový kompilátor a změnit cestu ke knihovnám OCaml z verze "host" na verzi "powerpc". Když ještě vynecháme absolutní cesty, vypadají příkazy, které potřebujeme spustit, následovně.

$TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o osxsupport.o -Ilwt -Iubase -Isystem -Isystem/generic -Ilwt/generic -I$TURRIS/powerpc/lib/ocaml osxsupport.c
$TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o pty.o -Ilwt -Iubase -Isystem -Isystem/generic -Ilwt/generic -I$TURRIS/powerpc/lib/ocaml pty.c
$TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC -c -o bytearray_stubs.o -Ilwt -Iubase -Isystem -Isystem/generic -Ilwt/generic -I$TURRIS/powerpc/lib/ocaml bytearray_stubs.c


Výsledek jako vždy prověříme
file *.o
a měli bychom se dozvědět, že
bytearray_stubs.o: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped
osxsupport.o:      ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped
pty.o:             ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped


Nyní zbývá už jen slinkováním všech součástí vytvořit vlastní spustitelný soubor Unisonu. Potřebný příkaz je skoro na konci výpisu z kompilace a vypadá nějak takto.

ocamlc -verbose -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -o unison  unix.cma str.cma bigarray.cma ubase/rx.cmo unicode_tables.cmo unicode.cmo bytearray.cmo system/system_generic.cmo system/generic/system_impl.cmo system.cmo ubase/projectInfo.cmo ubase/myMap.cmo ubase/safelist.cmo ubase/uprintf.cmo ubase/util.cmo ubase/uarg.cmo ubase/prefs.cmo ubase/trace.cmo ubase/proplist.cmo lwt/pqueue.cmo lwt/lwt.cmo lwt/lwt_util.cmo lwt/generic/lwt_unix_impl.cmo lwt/lwt_unix.cmo case.cmo pred.cmo uutil.cmo fileutil.cmo name.cmo path.cmo fspath.cmo fs.cmo fingerprint.cmo abort.cmo osx.cmo external.cmo props.cmo fileinfo.cmo os.cmo lock.cmo clroot.cmo common.cmo tree.cmo checksum.cmo terminal.cmo transfer.cmo xferhint.cmo remote.cmo globals.cmo fpcache.cmo update.cmo copy.cmo stasher.cmo files.cmo sortri.cmo recon.cmo transport.cmo strings.cmo uicommon.cmo uitext.cmo test.cmo main.cmo linktext.cmo osxsupport.o pty.o bytearray_stubs.o -cclib -lutil

Jeho délky není potřeba se bát, vše vyřešíme doplněním parametrů -cc, -I a -ccopt na konec příkazu a opětovným spuštěním.

$TURRIS/host/bin/ocamlc -verbose -I lwt -I ubase -I system -I system/generic -I lwt/generic -custom -g -o unison  unix.cma str.cma bigarray.cma ubase/rx.cmo unicode_tables.cmo unicode.cmo bytearray.cmo system/system_generic.cmo system/generic/system_impl.cmo system.cmo ubase/projectInfo.cmo ubase/myMap.cmo ubase/safelist.cmo ubase/uprintf.cmo ubase/util.cmo ubase/uarg.cmo ubase/prefs.cmo ubase/trace.cmo ubase/proplist.cmo lwt/pqueue.cmo lwt/lwt.cmo lwt/lwt_util.cmo lwt/generic/lwt_unix_impl.cmo lwt/lwt_unix.cmo case.cmo pred.cmo uutil.cmo fileutil.cmo name.cmo path.cmo fspath.cmo fs.cmo fingerprint.cmo abort.cmo osx.cmo external.cmo props.cmo fileinfo.cmo os.cmo lock.cmo clroot.cmo common.cmo tree.cmo checksum.cmo terminal.cmo transfer.cmo xferhint.cmo remote.cmo globals.cmo fpcache.cmo update.cmo copy.cmo stasher.cmo files.cmo sortri.cmo recon.cmo transport.cmo strings.cmo uicommon.cmo uitext.cmo test.cmo main.cmo linktext.cmo osxsupport.o pty.o bytearray_stubs.o -cclib -lutil -cc $TURRIS_TOOLCHAIN/bin/powerpc-openwrt-linux-uclibcspe-gcc -I $TURRIS/powerpc/lib/ocaml -ccopt '-I../powerpc/lib/ocaml'

Výsledek opět pro jistotu zkontrolujeme
file unison
a očekáváme, že se dozvíme
ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Soubor unison stačí nakopírovat na router na nějaké standardní umístění (například do /usr/bin) a můžeme začít používat synchronizaci souborů, nic dalšího už potřeba není.

Vzniklý binární soubor doporučuji zálohovat ještě někde jinde, abychom po případném resetu Turrisu do továrního nastavení nebylo potřeba absolvovat celý tento proces znovu.

Pokročilejší uživatele, které by hlášení "not stripped" mohlo inspirovat k použití příkazu strip a odstranění debugovacích informací, které zbytečně zvyšují velikost souboru, bych na rozloučenou ještě varoval: nedělejte to, odstraníte tím i bytekód obsažený v souboru, takže vám výsledek bude k ničemu.
- Od svamberg Dne 2015-03-28 15:39 Hlasů 1
Děkuji za perfektní návod včetně vysvětlení, co je špatně, je to poučné. Unison je skvělý na jednoduché zálohování aniž by muselo na serveru něco běžet. Líbilo by se mi, kdyby někdo znalý v balíčkování na to udělal balík pro openwrt. Sestavení se podařilo a vysledek pro unison 2.48.3 si lze stahnout, nemusíte procházet relativně zdlouhavou kompilací, ale zase musíte důvěřovat, že jsem ty zdrojáky neupravil :-)
- - Od mkyral Dne 2016-03-12 21:19 Hlasů 2
Díky za návod, zkoušel jsem kompilaci na amd64 ovšem skončil jsem v kroku 4. OCaml pro router
Kompilaci mi sice skončila s chybou, ale úplně jinou než je v návodu ;-)

Chvíli jsem se snažil to nějak zprovoznit, ale nepovedlo se. Naštěstí mi pak strýček Google našel toto vlákno: (OpenWrt-Devel) (PATCH) (RFC) toolchain: add OCaml compiler, díky kterému jsem byl, po menším boji, schopen zkompilovat ocaml i unison.

Protože to nebylo jen tak, přikládám návod. Pozor, jedná se o verzi 2.48.3.

Krok 0 - Příprava - není potřeba stahovat ocaml a unison zdroje (wget příkazy na konci).
místo toho stáhneme balíček s patchi a rozbalíme:


mkdir turris
cd turris/
export TURRIS=$PWD

wget http://www.kyralovi.cz/tmp/turris/unison-2.48.3_turris.patches.tar.gz
tar xzf unison-2.48.3_turris.patches.tar.gz


Krok 1 - stáhneme kódy openWRT, opatchujeme a zkompilujeme

cd $TURRIS

git clone --depth 1 https://gitlab.labs.nic.cz/turris/openwrt.git
cd openwrt/

cp -f configs/config-turris-nand .config
make defconfig


Přidáme balíčky ocaml a unison

git apply ../0001-toolchain-add-OCaml-compiler.patch
git apply ../0002-package-Add-Unison-File-Synchronizer.patch

git si sice stěžuje na nějaké přebývající bílé znaky, nicméně to hlavní se provede.

Teď aktualizujeme .config soubor:

make defconfig

A povolíme kompilaci ocaml

sed -i "s/# CONFIG_OCAML is not set/CONFIG_OCAML=y/" .config

Zkompilujeme nástroje včetně knihovny ocaml a ncurses
Poznámka: máte-li vícejádrový procesor, můžete si zapnout kompilaci na více jádrech pomocí "-j<počet_jader>" - tedy make -j4 pro kompilaci ve čtyřech vláknech najednou.

make toolchain/install
make package/ncurses/install


nebo

make -j4 toolchain/install
make -j4 package/ncurses/install


Krok 2 - kompilace a vytvoření balíčku unison

echo "CONFIG_PACKAGE_unison=m" >>.config
make package/unison/compile
make package/unison/install


Když vše dobře dopadne, najdete balíček v adresáři $TURRIS/openwrt/bin/mpc85xx/packages/base/
ls -la $TURRIS/openwrt/bin/mpc85xx/packages/base/unison*.ipk
-rw-r--r-- 1 marian users 2189096 12. bře 20.27 /mnt/data/turris/openwrt/bin/mpc85xx/packages/base/unison_2.48.3-1_mpc85xx.ipk


Tento balíček překopírujete na turris, kde jej nainstalujete pomocí příkazu:
opkg install /cesta/k/balíčku/unison_2.48.3-1_mpc85xx.ipk

A ověříme funkčnost:
unison -version

Výsledek pak vypadá takto:
turris ~ # unison -version
unison version 2.48.3
turris ~ #
Nadřazený - - Od jirig Dne 2016-03-13 14:01
To je skvělé, že jste prozkoumal a popsal způsob, jak kompilaci provést pomocí standardních mechanismů pro vytváření balíčků. Pro většinu lidí je to určitě mnohem pohodlnější postup. Doplnil jsem odkaz na Váš návod do svého úvodního příspěvku, aby lidé zbytečně nechodili složitější cestou. Díky moc.
Nadřazený - Od mkyral Dne 2016-03-13 16:07
Není zač. Já jen našel patche a s trochou námahy z toho udělal balíček :wink:
Plánuji zrušit NAS krabičku co mám a nahradit ji Turrisem, takže funkční Unison byl nezbytný krok.

Akorát je škoda, že od září se s těmi patchi nic nestalo. Alespoň jsem je nikde v openWRT nenašel.
Nahoru Téma Majitelé routerů / Uživatelská vylepšení / Unison File Synchronizer

Powered by mwForum 2.29.3 © 1999-2013 Markus Wichitill