Compileren software voor OpenWrt

Okee je hebt een device waarop OpenWrt loopt (bijvoorbeeld de Asus WL-HDD) en je wilt nu zelf software schrijven voor dit device. We gaan ervan uit dat de toolchain voor OpenWrt aanwezig is. Heb je deze nog niet, lees dan het artikel Compileren van OpenWrt.

Voorbereidingen

Op de build computer, dat is de computer met de OpenWrt-source/SDK/toolchain, gaan we het HelloWorld-package bouwen.

  1. Ga eerst naar de directory met de OpenWrt-source: cd ~/OpenWrt/8.09
  2. Maak hier de directory-structuur voor het nieuwe package:
  • mkdir package/helloworld
  • mkdir package/helloworld/src

HelloWorld-programma schrijven

Nu schrijven we een simpel HelloWorld-programma dat de tekst “Hello world!” naar standaard uitvoer (stdout) stuurt: package/helloworld/src/helloworld.c

#include <stdio.h>

int main(void){
        printf("Hello world!\n\n");
        return 0;
}

Makefiles maken

Een simpele Makefile (package/helloworld/src/Makefile) voor dit programma ziet er zo uit:

helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
        $(CC) $(CFLAGS) -c helloworld.c

clean:
        rm *.o helloworld

Tip 1: Let op de tabs in plaats van spaties aan het begin van de regels.

Tip 2: Dit programma moet standalone kunnen compileren en runnen:

cd package/helloworld/src && make && ./helloworld && cd $OLDPWD

Maak nu de Makefile (package/helloworld/Makefile) voor OpenWrt. Dit is als het ware het ‘recept’ voor het package. Let wederom op de tabs in plaats van spaties aan het begin van de regels.

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk

define Package/helloworld
        SECTION:=utils
        CATEGORY:=Utilities
        TITLE:=Helloworld
endef

define Build/Prepare
        mkdir -p $(PKG_BUILD_DIR)
        $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Configure
endef

define Build/Compile
        $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)
endef

define Package/helloworld/install
        $(INSTALL_DIR) $(1)/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef

$(eval $(call BuildPackage,helloworld))

Selecteren van package

Zorg nu dat het HelloWorld-package is gekozen met het commando: make menuconfig

  1. Selecteer: Utilities
  2. Zoek ‘helloworld‘ op, ga erop staan en druk op M. Als het goed is verschijnt nu de letter M voor ‘helloworld’.
  3. Ga dit configuratiemenu uit (2x Exit) en sla de nieuwe OpenWrt configuratie op, wanneer hierom gevraagd wordt.

Compileren

Compileer nu het package: ‘helloworld’:
make package/helloworld/compile V=99

Als het compileren en packagen goed is gegaan zal het HelloWorld-package zich nu hier bevinden: bin/packages/mipsel/helloworld_1_mipsel.ipk

Tip: Verschijnt tijdens het compileren een melding zoals: ‘missing separator‘, controleer dan of in de Makefiles inderdaad tabs zijn gebruikt en geen spaties.

HelloWorld-package installeren en testen op OpenWrt-device

  1. Kopieer nu dit package naar het device waar OpenWrt op draait. Hier wordt aangenomen dat het IP-adres van dat device: 192.168.1.2 is:
    scp bin/packages/mipsel/helloworld_1_mipsel.ipk root@192.168.1.1:/tmp
  2. Installeer het HelloWorld-package: opkg install /tmp/helloworld_1_mipsel.ipk
  3. Voer het HelloWorld-programma uit: helloworld

Let op de uitvoer van dit programma!
…. Hello world! …. dat hadden we nou niet verwacht.

Enkele handige OPKG-commando’s

  • Verwijder het HelloWorld-package: opkg remove helloworld
  • Informatie over het package HelloWorld: opkg info helloworld
  • Welke bestanden bevat het package HelloWorld? : opkg files helloworld

Zie ook