Zunaechst: dies ist hier nur zum schnellen Einstieg gedacht. Bitte fuer solides Wissen zu buildroot unbedingt lesen:
https://buildroot.org/downloads/manual/manual.html

Gibt auch Praesentationsvideo: https://www.youtube.com/watch?v=0LJHx09RF80


Um mit buildroot zu arbeiten am besten folgendes tun:

svn co https://10.102.20.77/svn/MainBoardLinuxGen5/trunk/host/buildroot/buildroot-2020.02.8
oder alternativ als projekt in eclipse auschecken.

Damit wurde das komplette buildroot-2020.02.8 ausgecheckt incl. unserer eigenen Konfigurationsdateien, Patches etc..


Entsprechend der Buildroot-Konvention befinden sich Hilfsskripte, Patches, Rootfs-overlays usw. dort in board/cv.
README-Dateien (wie diese) befinden sich dort in doc, also board/cv/doc.

Unsere Konfigurationen sind:
configs/cv_*

Zum Zeitpunkt der Erstellung dieser Dokumentation sind dies:
- configs/cv_octavo_produktion_defconfig
- configs/cv_octavo_standard_defconfig

Es werden wahrscheinlich weitere Konfigurationen erstellt werden, z.B. cv_octavo_standard_ext_toolchain_defconfig
mit etwa der aus cv_octavo_standard_defconfig erstellten SDK-Toolchain, damit diese nach clean nicht immer neu gebaut werden muss.


Um die beiden Produktiv-Konfigurationen zu bauen wurden fuer den leichteren Einstieg folgende Hilfsskripte abgelegt:
- board/cv/build_produktion.sh
- board/cv/build_standard.sh

Das Default-output-Verzeichnis in buildroot ist "output" und befindet sich dann leider innerhalb des SVN-Workspaces mit den 
bekannten Problemen wie ignore-verwaltung und ueberlasteter eclipse-svn-cache.

Man kann jedoch mit O=<verzeichnis> ein anderes Output-Verzeichnis definieren.
In obigen Skripten sind diese ../output_produktion bzw. ../output_standard, d.h. direkt parallel zum svn-workspace.

In Buildroot wird wie man sieht mit make gebaut.

Man beginnt ueblicherweise mit einer sog. "defconfig" (bei uns z.B. configs/cv_octavo_produktion_defconfig).
Diese muessen immer im Verzeichnis configs liegen und ihr Name muss mit "_defconfig" enden.

Man fuehrt dann z.B. einfach im workspace-Basisverzeichnis (dort wo sich die Verzeichnisse configs und board befinden) folgendes aus:
make cv_octavo_standard_defconfig
In diesem Fall wuerde alles im Verzeichnis "output" gebaut.
Moechte man es woanders bauen fuegt man O=<verzeichnis> hinzu, z.B.
make O=../output_standard cv_octavo_standard_defconfig

Danach existiert das Verzeichnis ../output_standard mit einer Datei ".config" welche die Konfigurationen aus 
configs/cv_octavo_standard_defconfig enthaelt zzgl. Default-Einstellungen, die in der "defconfig" weggelassen werden.

Die Hauptkonfiguration fuer buildroot selbst kann man so bearbeiten:
cd ../output_standard
make menuconfig
Dann oeffnet sich in der console ein textbasiertes menu in dem man alle konfigurationeinstellungen machen kann.
Zum Verlassen dann einfach so oft ESC druecken bis die Konfiguration beendet ist (ohne Aenderungen) oder man gefragt wird
ob man die Aenderungen speichern moechte. Dann bei Bedarf bestaetigen.
Danach sind jedoch die Konfigurationsaenderungen nur in der Datei output_standard/.config
Danach kann man im output-Verzeichnis (hier output_standard) mit dieser geaenderten Konfiguration alles bauen:

make
oder
make all

Wenn man die Aenderungen getestet hat und einchecken moechte, muss man die Konfiguration in .config zunaechst wieder in
die defconfig (hier configs/cv_octavo_standard_defconfig) speichern.

Das geht so:
make savedefconfig

Danach sind die neuen Konfigurationen soweit abweichend von Standard-Konfigurationen alle abgelegt in configs/cv_octavo_standard_defconfig
und man kann diese in svn einchecken.

Die wichtigsten Packages in Buildroot sind bei uns:
- uboot
- linux

Diese sind nun jeweils von einer definierten Version der Standard-Sourcen von u-boot bzw. linux abgeleitet durch Patches.
Diese befinden sich in board/cv/u-boot/... und board/cv/common/kernel/... 

Aktuell werden sowohl fuer "produktion" als auch "standard" die gleichen sourcen verwendet, dies kann jedoch bei Bedarf mit
make menuconfig (siehe oben)
geaendert werden.

Die Konfiguration fuer Linux ist aktuell ebenso gleich, koennte bei Bedarf aber ebenso mit "make menuconfig" angepasst werden.

Beim Bootloader U-Boot gibt es jedoch eine unterschiedliche Konfiguration fuer produktion und standard.
Beim Booten von der Produktions-SD-Karte soll naemlich eine evtl. bereits bestehende Umgebung in der dafuer vorgesehenden
Flash-Partition platt gemacht werden. Der Bootloader fuer "Standard" soll dies natuerlich nicht tun, da wichtige Statusinfos
wie welche der beiden rootfs-Partitionen die gerade aktive ist etc. dort gespeichert sind.

Daher wurden die U-Boot-Konfigurationen nicht in board/cv/common/u-boot, sondern in 
board/cv/cv_octavo_produktion/u-boot/bt_produktion_defconfig
bzw. board/cv/cv_octavo_standard/u-boot/bt_standard_defconfig
abgelegt.
Diese sind jeweils in configs/cv_octavo_produktion_defconfig bzw. configs/cv_octavo_standard_defconfig definiert.
Geaendert werden kann es ebenso ueber "make menuconfig" und anschliessendes "make savedefconfig".

Moechte man jedoch nicht aendern, welche defconfigs fuer u-boot verwendet werden, sondern deren Inhalt an sich, muss
man folgendes machen.
1. Ins output_<...> wechseln
2. make uboot-menuconfig
3. aenderungen wie gewuenscht vornehmen
4. ESC bis aufforderung zum Speichern kommt, dies bestaetigen

Danach befindet sich die neue Konfiguration aber nur lokal in output_<...>/build/uboot-<...>/.config

Nun kann man u-boot mit dieser neuen konfiguration erstellen mit:
make uboot
und das neue uboot testen (auf sd-karten-bootpartition kopieren oder die dafuer vorgesehene nand-partition flashen).
Um die Aenderungen von output_<...>/build/uboot-<...>/.config in die defconfig-datei (z.B. cv/cv_octavo_standard/u-boot/bt_standard_defconfig)
zu bekommen macht man: make uboot-update-defconfig

Moechte man zwar eine defconfig erzeugen, aber nicht dass die ausgangs-defconfig ueberschrieben wird macht man:
make uboot-savedefconfig
Die defconfig befindet sich dann in: output_<...>/build/uboot-<...>/defconfig und kann von Hand nach belieben kopiert werden.

Analog verfaehrt man fuer Linux bzw. "kernel" genannt.
Auf diese Weise koennte man auch busybox und andere Packages konfigurieren.

TODO: Erlaeuterungen zu SDK, Update, ...