OpenWrt - kompilacja systemu
Kompilacja OpenWrt, Gargoyle i pakietów
Ostatnia zmiana: 2014-04-26 22:47

1. Pobieranie źródeł
 1.1. Aktualizacja
2. Konfiguracja
3. Kompilacja środowiska
 3.1. Czyszczenie kompilacji
4. Kompilacja pojedynczego pakietu
5. Kompilacja programu z kodu źródłowego
6. Kompilacja Gargoyle
 6.1. Pobieranie źródeł
 6.2. Kompilacja


Ten poradnik nie jest przeznaczony dla 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 (Attitude Adjustment), źródła będą znajdować się w katalogu /opt/attitude_adjustment - 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. System powinien zawierać podstawowy pakiet programów przeznaczonych do kompilacji, czyli np. dla Debiana/Ubuntu/LinuxMint będzie to:

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

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

Ważna uwaga: OpenWrt NIE kompiluje się jako root! Trzeba zrobić to jako normalny użytkownik, przy próbie kompilacji jako root zostanie wyświetlone odpowiednie ostrzeżenie i przerwana kompilacja, a później może być problem z uprawnieniami do plików.

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 2 do 10GB wolnej przestrzeni dyskowej. 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 katalogu /opt!

    $ cd /opt
    $ svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment

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

    $ cd attitude_adjustment
    $ make package/symlinks

Powyższe polecenie pobiera aktualną gałąź wydania OpenWrt Attitude Adjustment 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 /opt/attitude_adjustment.
Aktualizacja

    $ svn up
    $ 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ć też opcji jeżeli wyskoczą błędy podczas kompilacji i chcemy się dowiedzieć w jakich pakietach one się pojawiły)
Jeżeli chcemy uzyskać więcej informacji podczas kompilacji należy posłużyć się odpowiednim przełącznikiem

    $ make V=s

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) to obraz po prostu nie zostanie wygenerowany.

Cały katalog źródeł wraz z kompilacjami i pakietami źródłowymi zabiera może zabrać kilka gigabajtów lub więcej przestrzeni dyskowej.
Czyszczenie kompilacji
Przy zmianie czegoś w kernelu może okazać się koniecznie 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

Kompilacja pojedynczego pakietu

    $ make package/nazwa_pakietu/compile

Gdzie nazwa_pakietu 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ć wcześniej zaznaczony w konfiguracji (w make menuconfig - przez <M> lub <*>).

Dostępna jest opcja czyszczenia kompilacji pakietu, czyli

    $ make package/nazwa_pakietu/clean

Co może być pomocne w przypadku dużych aktualizacji pakietów czy samodzielnego tworzenia łatek.
UWAGA: aby móc skompilować jeden pakiet wcześniej musi być skompilowane całe środowisko dla danej platformy!
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 attitude_adjustment jest to np. staging_dir/toolchain-mips_r2_gcc-4.6-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=/opt/attitude_adjustment/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2
    $ cd ${STAGING_DIR}
    $ bin/mips-openwrt-linux-uclibc-gcc -o program plik1.c plik2.c plik3.c -I${STAGING_DIR}/../target-mips_r2_uClibc-0.9.33.2/usr/include -L${STAGING_DIR}/../target-mips_r2_uClibc-0.9.33.2/usr/lib -lbiblioteka

Oczywiście należy podać wszystkie opcje kompilacji i linkowania niezbędne do stworzenia danego programu. 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
UWAGA: aby móc skompilować własny pakiet wcześniej musi być skompilowane całe środowisko dla danej platformy i niezbędne biblioteki!
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

W Gargoyle dostępne są do kompilować następujące cele: alix (x86), ar71xx, atheros-2.6, brcm47xx, custom.
Uwaga: Gargoyle samodzielnie ściąga źródła Attitude Adjustment (lub trunk, w zależności od wersji), 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 ł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.