jump to navigation

Compilar programas para la fonera 9 octubre, 2010

Posted by ubanov in Informática-Linux.
Tags: , , ,
trackback

En la web hay muchas páginas sobre cómo poder compilar programas para la fonera, lo malo es que las páginas que aparecen no están del todo actualizadas, con lo que cuando he intentado seguir las instrucciones me he vuelto un poco loco.

En este post escribo mis notas sobre cómo hacer la compilación, empleando como ordenador de compilación un Debian 5 de 64bits (con todos los parches actualizados hasta el 6 de Octubre de 2010) .

Lo que vamos a obtener es el firmware para instalar en la fonera y además el entorno necesario para compilar paquetes que creemos.

Antes de hacer nada más, es necesario instalar unos cuantos paquetes de software. En concreto yo he instalado los siguientes:

apt-get install binutils cpp gcc libc6-dev make zlib1g-dev ncurses-dev g++ gawk bison flex unzip bzip2 autoconf libdigest-crc-perl python subversion linux-libc-dev patch intltool

La máquina estaba casi recién instalada por lo que no creo que falte ninguno.

Una vez hecho esto vamos a empezar a bajar los fuentes. Es OBLIGATORIO hacerlo como un usuario que no sea root (lo comprueba en la compilación y nos da error), por lo tanto antes de empezar a hacer nada más ejecutaremos “su – usuario”, donde usuario sea el nombre de algún usuario que tengamos creado en el sistema. Esto nos posicionará en el directorio /home/usuario.

Lo primero a hacer será bajar los fuentes de la fonera. Para ello ejecutar:

svn co http://svn.fonosfera.org/fon-ng/trunk/

Al de un rato nos habrá bajado el directorio trunk con todo su contenido (vamos lo que necesitamos).

Para compilar los fuentes hay que ejecutar los siguientes comandos, pero antes de hacerlo comprobar que tengas 4,2Gigas de espacio libre, que sino te va a dar error (lo digo por que me ha pasado):

cd trunk
./install
cd openwrt
make menuconfig
make V=99

En el paso de menuconfig nos preguntará las opciones y paquetes adicionales que queremos instalar. Yo recomiendo la primera vez no añadir ningún paquete adicional y simplemente compilar con lo que viene por defecto, aunque seleccionando el tipo de fonera de la que dispones. De esta forma comprobaremos que todo compila bien, y luego ya trastearemos… El último make va a tardar bastante tiempo😀

Si todo va bien tendremos compilado un primer firmware nuevo, con el que podríamos flashear nuestra fonera.

Sobre un firmware podríamos añadir nuevos paquetes (nuevo software), del repositorio de paquetes de OpenWrt. Para ello ejecutaríamos los comandos siguientes:

scripts/feeds update -a

scripts/feeds install <paquete>

Donde <paquete> sería el nombre del paquete a instalar (por ejemplo tcpdump). Más información en http://trac.fonosfera.org/fon-ng/wiki/build

El siguiente paso va a ser compilar nuestro primer programa (el típico helloworld.c), utilizando el entorno anteriormente creado.

Para ello vamos a crear los siguientes tres ficheros. En openwrt/packages/helloworld/src/helloworld.c (los directorios hay que crearlos antes, evidentemente) tendrá el siguiente contenido:

#include <stdio.h>
int main(void)
{
printf(“Hola mundo desde la fonera\n”);
return 0;
}

Después crearemos un Makefile para el programa, en openwrt/packages/helloworld/src/Makefile:

# Makefile para el helloworld
helloworld: helloworld.o
\t $(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
\t $(CC) $(CFLAGS) -c helloworld.c
clean:
\t rm *.o helloworld

Donde he puesto \t tendremos que poner tabuladores (vamos que no te va a funcionar un Copy&paste directo), sino el make no funcionará. Podríamos comprobar que todo está ok, ejecutando make y comprobando que nos crea el programa ejecutable helloworld (incluso podemos ejecutarlo, por que por ahora es para ejecutar en tu debian🙂

El siguiente paso es crear el Makefile para el entorno OpenWrt. Para ello crear el siguiente fichero en openwrt/packages/helloworld/Makefile:

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_VERSION:=1.00
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk

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

define Package/helloworld/description
\t Primer programa para compilar (el tipico helloworld)
endef

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

define Build/Configure
endef

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

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

$(eval $(call BuildPackage,helloworld))

Nos vuelve a pasar el tema de \t que hay que convertirlos en tabuladores. La explicación de qué hace cada parte del Makefile la podéis encontrar aquí: http://hype-free.blogspot.com/2009/04/compiling-software-for-openwrt-and.html (ya que ya está escrito no vamos a repetirnos, y así le damos el crédito que se merece😀

Podríamos compilar el programa, ejecutando “make menuconfig” desde el directorio openwrt; ahí nos aparecería un nuevo paquete disponible en la sección de Utilities. Si lo quisiéramos compilar podríamos hacerlo como módulo, de esta forma nos crearía el fichero openwrt/bin/packages/mips/helloworld_1.00-1_mips.ipk, o bien como un paquete instalado en una imagen para actualizar la fonera (en openwrt/bin/openwrt-fonera2-squashfs.img).

Como alternativa también podríamos crear el SDK para no tener que compilar todo el firmware.

Espero que a alguien le sirva para algo😀  a partir de aquí a trastear cada uno lo que pueda

Comentarios»

No comments yet — be the first.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: