Portowanie Tizena na nowe architektury na przykładzie ARMv6
Transkrypt
Portowanie Tizena na nowe architektury na przykładzie ARMv6
X P.I.W.O. 17 Maj 2014 - Poznań, Polska Portowanie Tizena na nowe architektury na przykładzie ARMv6 Maciej Wereski Samsung R&D Institute Poland Plan prezentacji Środowisko budowania Tizena Infrastruktura GBS Paczki zależne od architektury Dodawanie nowej architektury Problem z GBSem Wybór rozwiązania Bootstrapowanie Wymagane źródła Środowisko RPM bootstrap Czas na pozostałe paczki Jądro Tworzenie obrazów Użycie Mica 2 Środowisko budowania Tizena Architektura vs. Profil . Architektura . Architektura sprzętowa (np. i586, armv7l) . . Platforma . Paczki współdzielone przez wszystkie profile. git: wszystko co znajduje się w platform/ (np. platform/upstream). . . Profil . Zestaw paczek specyficznych dla danej klasy urządzeń (np. usługi automotive na profilu IVI). git: wszystko co znajduje się w profile/* (np. profile/mobile). . 4 Nowa architektura może być dodana dla istniejących profili, nowy profil może być dodany dla nowej architektury lub nowy profil może być dodany do istniejącej architektury. 5 Budowanie i pakietowanie w Tizenie • paczki RPM • build server: OBS (http://build.tizen.org) • lokalne budowanie paczek: GBS • lokalne obrazy: mic 6 Repozytorium git • gałęzie: tizen, upstream, pristine-tar • katalog packaging zawierający speca i manifest SMACKa (na gałęzi tizen) • zmiany, które nie są z upstreamu jako oddzielne commity na gałęzi tizen 7 Czym jest GBS? GBS działa w następujący sposób: 1. tarball jest tworzony z gałęzi pristine-tar bądź upstream 2. łaty są generowane z gałęzi tizen 3. spec jest modyfikowany (dodanie łat, itp.) 4. rpmbuild jest uruchamiany w chrootie 8 . Zalety GBSa . GBS ułatwia proces budowania, automatycznie rozwiązuje zależności, zarządza środowiskiem budowania. . . Uwaga . GBS korzysta z qemu do natywnego budowania w chrootie. . 9 qemu-accel qemu-accel przyspiesza budowanie paczkek w chrootie GBS. Dostarcza skompilowane na architekturę gospodarza pliki podstawowych narzędzi (binutils, gettext, ...), które zostaną użyte zamiast narzędzi skompilowanych na architekturę gościa. . Budowanie qemu-accel . .gbs build -A i586 -P mobile --baselibs 10 Dodawanie nowej architektury Problem Do budowania GBSem jest potrzebne repozytorium z RPMami (zależności). Jednak dla nowej architektury nie posiadamy takich paczek. 12 Możliwe rozwiązania Musimy w jakiś sposób uzyskać wymagane pakiety: • znalezienie RPMów na pożądaną architekturę • stworzenie RPMów ze źródeł Tizena . Wymagany zestaw paczek . Potrzebujemy jedynie podstawowego zestawu paczek (gcc, rpm, qemu-accel i zależności). Mając te paczki możemy zacząć budować używając GBSa. . 13 Użycie zewnętrznych RPMów • łatwiejsze i szybsze rozwiązanie • może nie być paczek na wymaganą architekturę 14 Zbudowanie RPMów • można zbudować na 2 sposoby: natywnie lub skompilować skrośnie • wymaga więcej czasu i jest trudniejsze 15 Kompilacja natywna • pliki spec wymagają mniej zmian • łatwiej skonfigurować środowisko • musi być już system na danej architekturze • potrzebny sprzęt 16 Kompilacja skrośna • pliki spec i środowisko wymagają więcej zmian • nie musi istnieć system na daną architekturę • nie trzeba posiadać sprzętu Użyjemy tego podejścia. 17 Bootstrapowanie Cel Zbudowanie wszystkich paczek, które doprowadzą nas do rpm-xxx-armv6l.rpm . Pobranie źródeł . Wszystkie repozytoria znajdują się na: https://review.tizen.org/git/ . 19 chroot Korzystamy z systemu w chrootie (np. zainstalowanego debootstrapem albo pacstrapem). Potrzebujemy następujących rzeczy: • skrośne narzędzia, tj. gcc, g++, binutils (ze standardowych dystrybucyjnych paczek) • rpmbuild • rpm2cpio + cpio 20 Makra RPM 1. makra z istniejącej paczki rpm jako baza (armv7l w naszym przypadku). 2. Edycja: • • • • ustawić prawidłową architekturę ustawić odpowiednie ścieżki ustawić właściwe flagi ... 3. zapsanie w odpowiednim miejscu (żeby rpmbuild mógł ich użyć -- więcej man rpmbuild) 21 . narzędzia i prefix . %__cc /usr/bin/arm-linux-gnueabi-gcc %__cpp /usr/bin/arm-linux-gnueabi-gcc -E %__cxx /usr/bin/arm-linux-gnueabi-g++ %__ld /usr/bin/arm-linux-gnueabi-ld %__nm /usr/bin/arm-linux-gnueabi-nm %__objcopy /usr/bin/arm-linux-gnueabi-objcopy %__objdump /usr/bin/arm-linux-gnueabi-objdump %__ranlib /usr/bin/arm-linux-gnueabi-ranlib %_prefix /arm/usr . 22 . flagi . %_build x86_64-unknown-linux-gnu %_build_alias x86_64-unknown-linux-gnu%nil %_build_cpu x86_64 %_build_vendor %_host_vendor %_build_os %_host_os %_host armv6l-tizen-linux-gnueabi %_host_alias armv6l-tizen-linux-gnueabi%nil %_host_cpu armv6l %_host_vendor tizen %_host_os linux %_target armv6l #... %_arch armv6l . 23 host-x-host Używamy kompilatora skrośnego do zbudowania kompilatora natywnego, który będzie używany na innej architekturze. To oznacza, że opcje --host i --target powinny być takie same, natomiast --build powinien określać system, w którym budujemy. 24 modyfikacje speca Większość modyfikacji to ustawienie odpowiednich zmiennych środowiskowych, np. CC=%{__cc}, CXX=%{__cxx}. Inne problemy, które mogą się pojawić: • niektóre makra RPM mogą nie istnieć, e.g. %docs_package, %manifest, %license, ... (te, na które się natknąłem można usunąć) • może być konieczność modyfikacji/dodania flag do wywołania configure 25 rpmbuild Wymagane opcje: • -ba - 'build all', buduje paczki: binarną oraz źródłową • --nodeps - ignoruje zależności RPM, w przeciwnym przypadku budowa nie powiedzie się (nie mamy zależności!) • --target armv6l-tizen-linux-gnueabi kompilacja skrośna na docelową architekturę . przykładowe wywołanie rpmbuild . rpmbuild -ba --nodeps --target armv6l-tizen-linux-gnueabi bzip2.spec . Więcej informacji: man rpmbuild. 26 Instalacja spaczkowanych bibliotek Po zbudowaniu pakietów ich zawartość należy zainstalować przed rozpoczęciem budowania zależnych RPMów. Należy to zrobić w systemie, w którym budujemy paczki (dlatego budujemy to w chrootie). Należy też uważać, żeby nie nadpisać istniejących bibliotek (dlatego został użyty prefix /arm/usr). Do instalacji pakietów należy skorzystać z narzędzi rpm2cpio oraz cpio. . Instalacja zawartości paczki . rpm2cpio pkgname-pkgver-armv6l.rpm | cpio -idmv . Szczegóły: strony manuali rpm2cpio i cpio. 27 Czas na pozostałe paczki Czas na GBSa Gdy mamy już paczki rpm, qemu-accel i inne podstawowe paczki, to możemy zacząć używać GBSa. . Uwaga . Należy zacząć od przebudowania zbudowanych już paczek GBSem. . 29 Jądro Dodanie jądra Najłatwiejszym rozwiązaniem jest użycie oficjalnego jądra Raspberry Pi i ustawienie odpowiednich opcji: • SMACK • wymagane przez systemd (są wymienione w pliku README) 31 Tworzenie obrazów Używanie pliku kickstart • użycie pliku ks z profilu, na którym chcemy bazować nasz port • modyfikacja repozytoriów • modyfikacja list/grup pakietów • modyfikacja partycji 33 Ważne fragmenty pliku kickstart . Te fragmenty należy zmodyfikować . # repozytorium z paczkami do zainstalowania repo --name=bootstrap --baseurl=file:///path/to/repo/ # zdefiniowanie partycji part / --size 6144 --ondisk sda --fstype=ext4 --label tizen %packages # lista paczek i grup %end %post # skrypty postinstalacyjne %end . 34 Uruchamianie mica Różne typy obrazów: • loop • raw • fs • livecd • liveusb . Przykład . mic create raw -A armv6l --generate-bmap pi.ks . 35 Materiały Git Build System https://source.tizen.org/documentation/reference/git-build-system/ MIC Image Creator https://source.tizen.org/documentation/reference/mic-image-creator GCC: Configure Terms and History http://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html Cross Linux From Scratch http://trac.cross-lfs.org/ 36 Dziękuję za uwagę! 37