OpenWrt - kompilacja systemu
Kompilacja OpenWrt, Gargoyle i pakietówOstatnia zmiana: 2012-10-05 16:23
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. Pobierania ź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
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ł
$ cd /opt
$ svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment
$ cd attitude_adjustment
$ make package/symlinks
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
Konfiguracja
$ make menuconfig
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
Jeżeli mamy kilka rdzeni w CPU to przy późniejszych operacjach możemy uruchomić równoległą kompilację poleceniem
$ make -j3
$ make V=s
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
$ make dirclean
Kompilacja pojedynczego pakietu
$ make package/nazwa_pakietu/compile
Dostępna jest opcja czyszczenia kompilacji pakietu, czyli
$ make package/nazwa_pakietu/clean
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
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.Pobierania źródeł
$ git clone http://gargoyle-router.com/git/gargoyle.git
$ cd gargoyle
Kompilacja
$ make
$ ./full-build.sh
$ make ar71xx
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.