Compileren van OpenWrt

Zoals te lezen valt in het artikel: Embedded linux op Asus WL-HDD heb ik de pre-compiled OpenWrt versie WhiteRussian op mijn Asus WL-HDD geïnstalleerd. Deze versie van OpenWrt is echter al redelijk oud. Daarnaast wil ik zelf ook software ontwikkelen die werkt op de Asus WL-HDD.

Daarom heb ik besloten om OpenWrt zelf te gaan compileren. Op die manier heb ik zelf in de hand wat er in de firmware image geplaatst wordt. Maar belangrijker is nog dat ik dan ook direct de toolchain heb om mijn eigen programma’s voor dit apparaat te compileren. Voor dit laatste zou echter het downloaden en installeren van de OpenWrt SDK (software development kit) ook voldoende zijn.

Toolchain en cross compilatie

Een toolchain is een reeks van tools die gebruikt wordt om software te compileren en te packagen. Het bouwen (compileren) van OpenWrt doe ik niet op de Asus WL-HDD omdat deze qua processor en geheugen te beperkt is, maar op mijn desktop computer. Dit is in mijn geval een computer met een Intel processor en het besturingssysteem Ubuntu (versie 10.04.1 LTS). Het bouwen van software op een andere architectuur en/of met een ander besturingssysteem dan het doelsysteem wordt crosscompileren (cross compile) genoemd. Het besturingssysteem (operating system) wordt immers niet Ubuntu maar OpenWrt. Daarnaast is de processor van de Asus WL-HDD een Broadcom met een MIPS-architectuur en niet een Intel-processor met x86-architectuur. MIPS staat voor: Microprocessor without Interlocked Pipeline Stages en is gebasseerd op de RISC-processorarchitectuur. RISC staat dan weer voor: Reduced Instruction Set Computer. Dit is een processor die minder instructies kent vergeleken met de Complex Instruction Set Computers (CISC) waartoe de x86-processoren behoren. De RISC-processor heeft minder schakelingen, daardoor is het eenvoudiger deze processoren klein uit te voeren. Deze kennis is niet nodig om OpenWrt te compileren maar geeft wat achtergrondinformatie over crosscompilatie.

Build-omgeving

Laten we nu beginnen met het opzetten van de build-omgeving. Ik ga er dus vanuit dat Ubuntu wordt gebruikt als besturingssysteem en dat men ingelogd is als ‘gewone’ gebruiker en niet als ‘root’.

Eerst moeten de zogenaamde build-essentials en overige tools geïnstalleerd worden als je deze nog niet op jouw systeem hebt staan. Deze tools zijn niet specifiek voor OpenWrt. Dit kan gedaan worden met het volgende commando:

sudo apt-get install build-essential asciidoc autoconf binutils bison bzip2 flex gawk gettext libncurses5-dev libz-dev patch unzip zlib1g-dev subversion

De set van packages die nu wordt geïnstalleerd bevat onder andere Subversion (een software versie beheersysteem), een C-compiler, assembler, linker, compressietools en tools om met ASCII-karakters menu’s te maken.

Compileren OpenWrt

  1. Maak na de installatie van bovenstaande pakketten een werkdirectory en noem deze bijvoorbeeld: OpenWrt (mkdir ~/OpenWrt).
  2. Ga nu naar deze directory toe: cd ~/OpenWrt
  3. Het is nu tijd om de source-files van OpenWrt op te halen. Dit doen we met het Subversion commando: checkout. Gekozen wordt om de Kamikaze 8.09 versie te gebruiken.
    svn co svn://svn.openwrt.org/openwrt/branches/8.09
    Tip: Wil je een andere versie, zoek de branch- of tagnaam dan op met de source-browser: https://dev.openwrt.org/browser
  4. Stap nu in deze directory waarin de source-files staan die zojuist zijn gedownload:
    cd 8.09
  5. Download en installeer de feeds. Feeds zijn ‘recepten’ voor packages die op OpenWrt geïnstalleerd kunnen worden.
    ./scripts/feeds update -a && ./scripts/feeds install -a
    Tip: Locaties van de feeds staan in het bestand: feeds.conf.default
  6. Nu is het tijd om een basisinstallatie voor het build-systeem te maken. In deze stap worden ook de afhankelijkheden (dependencies) tussen de verschillende softwarepakketten gecontroleerd.
    make defconfig
  7. In de volgende stap kan men kiezen voor welke architectuur gebouwd wordt en welke packages gecompileerd moeten worden. Voor de Asus WL-HDD waren de standaard waarden (defaults) okee.
    make menuconfig
  8. Het is tijd om OpenWrt daadwerkelijk te gaan compileren. Eerst zullen de tools specifiek voor de toolchain van OpenWrt gemaakt worden. Vervolgens zullen dan ook de OpenWrt kernel en packages aan de beurt komen. Het uitvoeren van deze stap kan lange tijd duren. Na het compileren staan de packages en firmware images in bin-directory. Voer het volgende commando uit:
    make

Installeer nu deze versie van OpenWrt op een Asus WL-HDD

‘Frisse’ build

  1. Ga naar de directory waar de OpenWrt source-files staan.
    Bijvoorbeeld: cd OpenWrt/8.09
  2. Update de OpenWrt source-files: svn up
  3. Verwijder de vorige build: make distclean
  4. Update de package ‘recepten’:
    ./scripts/feeds update -a && ./scripts/feeds install -a
  5. Eventueel: make menuconfig
  6. Start compilatie: make