Kompilacja OpenWrt, Gargoyle i pakietów
Ostatnia zmiana: 2016-07-12 07:08

Ten poradnik nie jest przeznaczony dla zupełnie początkujących - jeżeli nie wiesz co to make, jak nakłada się łatki czy jak wygląda praca z repozytorium - najpierw zgromadź tą wiedzę u wujka Google.

Założenie - w poradniku będzie opisana kompilacja wersji stabilnej OpenWrt (Chaos Calmer), źródła będą znajdować się w katalogu ~/chaos_calmer - więc należy upewnić się że ma się tam prawa zapisu jako zwykły użytkownik. Do kompilacji potrzebny jest system *unix (np. Linux) lub MacOS/OS X. System powinien zawierać podstawowy pakiet programów przeznaczonych do kompilacji, czyli np. dla Debiana/Ubuntu/LinuxMint będzie to zestaw pakietów:


    # apt-get install build-essential binutils bzip2 gawk gettext git libncurses5-dev patch unzip zlib1g-dev subversion flex

Można używać systemu na maszynie wirtualnej.

Kompilacja działa prawidłowo dla Debiana i pochodnych (Ubuntu/Mint), dla x86 i x86_64. W przykładzie kompilowany będzie system dla architektury ar71xx - w przypadku innej platformy należy po prostu dostosować polecenia czy opcje. W zależności od wybranych opcji potrzebne jest od 2GB do 10GB wolnej przestrzeni dyskowej i dostęp online do internetu (do ściągania źródeł). Użytkownik musi mieć prawa zapisu do podanych katalogów.

Pobieranie źródeł

Należy się upewnić że zwykły użytkownik na którym to robimy ma prawa odczytu/zapisu do danego katalogu!


    $ cd ~
    $ git clone git://git.openwrt.org/15.05/openwrt.git
    $ mv openwrt chaos_calmer

To polecenie pobiera sam podstawowy system. Dostępne są jeszcze dodatkowe pakiety, które uzupełniają całość (tzw feeds), które też warto pobrać.


    $ cd chaos_calmer
    $ make package/symlinks

Powyższe polecenie pobiera aktualną gałąź wydania OpenWrt Chaos Calmer oraz dodatkowe dostępne pakiety (feeds). Wykonuje się to tylko jeden raz. Wszystkie poniższe operacje wykonuje się już będąc w katalogu ze źródłami, czyli wg założeń w ~/chaos_calmer.

Aktualizacja



    $ git pull
    $ make package/symlinks

Zawartość repozytorium zmienia się co jakiś czas (a jeszcze rzadziej wydawane są oficjalne wydania obrazów przez zespół OpenWrt), więc warto włączyć bieżące poprawki do źródeł które już mamy na dysku.

Konfiguracja



    $ make menuconfig

Tu należy wybrać żądną platformę i pakiety. Na samym początku wystarczy zostawić wartości domyślne, wybieramy tylko Target System np. Atheros AR71XX oraz Target Profile jako TP-Link TL-WR1043ND jeżeli chcemy kompilować dla tego urządzenia.
Znaczek <*> oznacza że z tego pakietu będzie z tego zrobiona paczka ipk i zostanie wkompilowany w wynikowy obraz, <M> - zostanie tylko skompilowany jako paczka. <--> oznacza że pakiet jest domyślnie wybrany, bo od niego zależy inny pakiet i nie da się go odznaczyć. Jeżeli wiemy że pakiet będzie używany i niezbyt często aktualizowany (np. moduły do USB, serwer ftp czy transmission) warto takie pakiety wkompilować w obraz - będą zajmowały znacznie mniej miejsca niż ich późniejsza instalacja w systemie.

Kompilacja środowiska



    $ make

Podczas kompilacji wymagane jest połączenie do internetu, ponieważ ściągane są źródła pakietów. Początkowa kompilacja (kroskompilator, kernel, pakiety) w zależności od ilości wybranych pakietów może trwać nawet kilka godzin! Jeżeli wykonujemy małą zmianą to następna kompilacja będzie już krótsza, bo kompilowane są tylko zmiany.

Jeżeli mamy kilka rdzeni w CPU to przy późniejszych operacjach możemy uruchomić równoległą kompilację poleceniem


    $ make -j3

(nie należy używać tej opcji jeżeli wyskoczą błędy podczas kompilacji i chcemy się dowiedzieć w jakich pakietach się one pojawiły)
Jeżeli chcemy uzyskać więcej informacji podczas kompilacji należy posłużyć się odpowiednim przełącznikiem


    $ make V=s -j1

Obrazy wynikowe i pakiety zostaną umieszczone w podkatalogu bin/. Jeżeli zaznaczymy za dużo pakietów i przekroczy to dopuszczalny rozmiar obrazów (np. 8MB dla TL-WR1043ND v1) to obraz po prostu nie zostanie wygenerowany.

Cały katalog źródeł wraz z kompilacjami i pakietami źródłowymi może zabrać kilka gigabajtów lub więcej przestrzeni dyskowej.

Czasami (w bardzo rzadkich przypadkach) może przydać się zmiana opcji kompilacji kernela. Można to zrobić poleceniem (po uprzedniej kompilacji systemu!)


    $ make kernel_menuconfig

zaznaczyć niezbędne opcje, zapisać a potem jeszcze raz skompilować cały system poleceniem make.

Czyszczenie kompilacji

Przy zmianie czegoś w kernelu może okazać się konieczna ponowna rekompilacja jądra i pakietów z modułami, przed kompilacją należy więc je wyczyścić:


    $ make target/linux/clean

Czasami wykonane zostało więcej zmian i nie da się skompilować ponownie obrazu. W takich przypadkach pomaga wyczyszczenie całego środowiska z plików kompilacji:


    $ make dirclean

Dodanie własnych plików do obrazu

Niekiedy istnieje potrzeba dodania do obrazów własnych plików konfiguracyjnych, ustawień lub skryptów. OpenWrt posiada do tego specjalny mechanizm, pozwalający łatwo wprowadzać zmiany do obrazu. Tworzymy folder o nazwie files w głównym katalogu z naszymi źródłami:


    $ cd ~
    $ cd chaos_calmer
    $ mkdir -p files

A następnie umieszczamy w nim pliki lub katalogi które mają znaleźć się w docelowym obrazie. Cała struktura katalogów zostanie przeniesiona 1:1, więc np. jeżeli chcemy podmienić plik /etc/banner w obrazie wynikowym na swój, to w katalogu files robimy podkatalog etc a w nim umieszczamy plik banner z własną zawartością:


    $ mkdir -p files/etc
    $ echo ">>>> to dziala!!! <<<<" > files/etc/banner

Kompilacja pojedynczego pakietu



    $ make package/nazwa_katalogu_z_pakietem/compile

Gdzie nazwa_katalogu_z_pakietem to nazwa katalogu w którym znajduje się pakiet (to trzeba niestety wiedzieć). Czyli jeżeli chcemy skompilować np. pakiet libffmpeg, a znajduje się on w katalogu ffmpeg, to kompilacja wygląda następująco: "make package/ffmpeg/compile", a nie "make package/libffmpeg/compile"! Żeby pakiet dało się skompilować musi być także wcześniej zaznaczony w konfiguracji (w make menuconfig - trzeba go wybrać przez <M> lub <*>).

Dostępna jest opcja czyszczenia kompilacji pakietu, czyli


    $ make package/nazwa_katalogu_z_pakietem/clean

Co może być pomocne w przypadku dużych aktualizacji pakietów czy samodzielnego tworzenia łatek.

Kompilacja programu z kodu źródłowego

Ogólnie - należy sporządzić odpowiedni plik Makefile który pozwoli na przygotowanie pakietu ze skompilowanym programem. W niektórych przypadkach chcemy tylko skompilować prosty program i można to zrobić "ręcznie".
Kroskompilator i resztę wymaganych plików (nagłówki, biblioteki) można znaleźć w katalogu staging_dir/toolchain-XXX (dla ar71xx i chaos_calmer jest to np. staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2). Kroskompilator znajduje się w podkatalogu bin (mips-openwrt-linux-uclibc-gcc), biblioteki są w staging_dir/target_*/usr/lib, pliki nagłówkowe w staging_dir/target_*/usr/include (w zależności od wersji mogą to być katalogi odpowiednio usr/bin, usr/lib i usr/include). Kompilacja przykładowego programu może więc wyglądać następująco:


    $ export STAGING_DIR=~/chaos_calmer/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
    $ cd ${STAGING_DIR}
    $ bin/mips-openwrt-linux-uclibc-gcc -o program plik1.c plik2.c ... -I${STAGING_DIR}/../target-mips_34kc_uClibc-0.9.33.2/usr/include -L${STAGING_DIR}/../target-mips_34kc_uClibc-0.9.33.2/usr/lib -ljakas_biblioteka

Oczywiście należy podać wszystkie opcje kompilacji i linkowania niezbędne do stworzenia danego programu (zamiast plik*.c i jakas_biblioteka). Powyższy przykład sprawdzi się dla prostych programów, dla bardziej zaawansowanych projektów prościej jest napisać odpowiedni Makefile podobnie jak to jest zrobione dla innych pakietów w katalogach package lub feeds. Budowa takiego Makefile opisana jest na wiki openwrt (po angielsku): http://wiki.openwrt.org/doc/devel/packages
Przykładowy program helloworld z odpowiednim Makefile dostępny jest tutaj: http://dl.eko.one.pl/projekty/helloworld.tar.gz

Kompilacja Gargoyle

Generalnie kompilacja wygląda w podobny sposób jak normalnego OpenWrt z tą różnicą, że Gargoyle zawiera własne skrypty służące do nakładania łatek i budowania całości.

Pobieranie źródeł



    $ git clone http://gargoyle-router.com/git/gargoyle.git
    $ cd gargoyle

Kompilacja



    $ make

lub po prostu


    $ ./build.sh

lub można skompilować określoną platformę np,


    $ make ar71xx


Gargoyle samodzielnie ściąga źródła OpenWrt, nakłada swoje łatki i kompiluje środowisko. Po wykonaniu w/w operacji powstaje katalog o nazwie np. ar71xx-src który zawiera wszystkie źródła wraz nałożonymi już łatkami. Jeżeli potrzebujemy minimalnej zmiany typu dodanie pakietu czy coś podobnego to nie ma sensu ponownie kompilować całego środowiska - należy po prostu wejść do tego katalogu i wykonać make menuconfig && make.