X PIWO 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 Ạrchitektura 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
5 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
Budowanie i pakietowanie w Tizenie paczki RPM build server: OBS (http://buildtizenorg) 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-armv6lrpm Pobranie źródeł Wszystkie repozytoria znajdują się na: https://reviewtizenorg/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ć, eg %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 bzip2spec 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 ṛpm2cpio pkgname-pkgver-armv6lrpm 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 ṃic create raw -A armv6l --generate-bmap piks 35
Materiały Git Build System https://sourcetizenorg/documentation/reference/git-build-system/ MIC Image Creator https://sourcetizenorg/documentation/reference/mic-image-creator GCC: Configure Terms and History http://gccgnuorg/onlinedocs/gccint/configure-termshtml Cross Linux From Scratch http://traccross-lfsorg/ 36
37 Dziękuję za uwagę!