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

Podobne dokumenty