Hace poco compré una segunda fonera (la primera que compré la uso de router en casa) con el ánimo de poder hacer cosillas medio interesantes con ella. Al fin y al cabo, es un dispositivo empotrado con un GNU/Linux dentro, así que habrá que estrujarlo ¿no?
Así pues, empecemos. Lo primero que hay que hacer, evidentemente, es flashear nuestra fonera e instalarle una versión de OpenWrt no modificada por los chicos de Fon. En Crysol se puede encontrar un manual muy bueno de como hacerlo, aunque yo personalmente lo hice utilizando un puerto serie (también hay recetazo en Crysol). Puedes utilizar cualquier imagen de OpenWrt en la página de descargas de OpenWrt, aunque yo explicaré como compilar una imagen para OpenWrt en nuestra máquina para cargarla después en la fonera.
Descargando Fuentes
Los fuentes de OpenWrt los podemos descargar del repositorio subversion del proyecto tal que así:
-
svn co https://svn.openwrt.org/openwrt/trunk
Una vez descargado el repositorio, vamos a crear un paquete para que se compile junto con el resto de la imagen. Después se verá como compilar los paquetes de forma independiente al resto de la imagen. Empecemos.
Paquete holamundo
Como ejemplo he escrito el típico holamundo en C y he hecho un Makefile para su compilación con una sola regla. El código necesario para el ejemplo puede descargarse a través de subversion:
-
svn checkout http://gn-cillos.googlecode.com/svn/trunk/fon-develop gn-cillos-read-only
Se puede observar que se encuentra el directorio con la aplicación holamundo y un archivador tar.gz con el mismo directorio ya comprimido. Ésto no tiene mucho que comentar, por lo que lo obviaré.
Lo importante aquí es el archivo Makefile que nos encontramos en el nivel superior. Éste Makefile es el utilizado para generar el paquete durante el proceso de compilación de la imagen OpenWrt.
-
#
-
# Copyright (C) 2006-2008 OpenWrt.org
-
#
-
# This is free software, licensed under the GNU General Public License v2.
-
# See /LICENSE for more information.
-
#
-
# $Id$
-
-
include $(TOPDIR)/rules.mk
-
-
PKG_NAME:=holamundo
-
PKG_VERSION:=0.1.1
-
PKG_RELEASE:=1
-
PKG_MD5SUM:=19a4d8bdc9bc7add4b3668969a546b68
-
PKG_SOURCE_URL:=http://localhost
-
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-
#PKG_CAT:=zcat
-
-
PKG_BUILD_DIR:=$(BUILD_DIR)/holamundo-$(PKG_VERSION)
-
-
include $(TOPDIR)/rules.mk
-
include $(INCLUDE_DIR)/kernel.mk
-
-
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-
-
include $(INCLUDE_DIR)/package.mk
-
-
define Package/holamundo
-
SECTION:=Toys
-
CATEGORY:=Misc
-
TITLE:=A gadget to print greetings. Spanish flavour.
-
URL:=http://localhost
-
endef
-
-
define Package/holamundo/Default
-
URL:=http://localhost
-
endef
-
-
define Package/holamundo/description
-
A message for help in menuconfig: You can write your help message here.
-
endef
-
-
define Build/Prepare
-
$(call Build/Prepare/Default)
-
endef
-
-
define Build/Compile
-
$(MAKE) -C $(PKG_BUILD_DIR)/src \
-
$(TARGET_CONFIGURE_OPTS) \
-
LD="$(TARGET_CC)" \
-
PROGRAMS="holamundo" \
-
MULTI=1 SCPPROGRESS=1
-
endef
-
-
define Package/holamundo/install
-
$(INSTALL_DIR) $(1)/usr/sbin
-
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/holamundo $(1)/usr/sbin/
-
endef
-
-
$(eval $(call BuildPackage,holamundo))
La primera parte del Makefile exporta la variable de entorno TOPDIR, utilizada para poder localizar todos los directorios con librerías y fuentes a partir de ahí. Después viene la declaración de variables de entorno para el Makefile. Las mas importantes son:
- PKG_NAME: Indica el nombre que tendrá el paquete. En nuestro caso, holamundo.
- PKG_VERSION: Versión del paquete.
- PKG_MD5SUM: Suma md5 del archivador con los fuentes del paquete a generar. Si tenemos ésta suma, la ponemos ahí, para comprobar que hemos descargado correctamente los paquetes de fuentes. Si el archivador lo hemos generado nosotros, con el comando md5sum podremos obtener fácilmente dicha suma.
- PKG_SOURCE_URL: Máquina en la que estará alojado el paquete con los fuentes. Generalmente se utiliza un protocolo http para obtener dichos fuentes (el Makefile los obtiene automáticamente con wget).
- PKG_SOURCE: Nombre del archivador con los fuentes a descargar. En nuestro caso, el archivador es holamundo-0.1.1.tar.gz, que contiene los fuentes de la aplicación que queremos compilar. Éstos fuentes pueden ser parcheados si lo deseamos, también de forma automática, aunque aquí no se ve dicho caso. Para ello, se puede consultar la documentación sobre OpenWrt que puede verse en las Referencias.
- PKG_CAT: Tipo de archivador descargado. Por defecto se tratará de un tar.gz.
- PKG_BUILD_DIR: Directorio temporal el en que se compilarán los fuentes. Es muy aconsejable que dicho directorio se encuentre dentro de $(BUILD_DIR)
- PKG_SOURCE: Archivador que contiene los fuentes ya descargados.
El archivador con los fuentes del paquete que se desea compilar debe encontrarse en una máquina accesible por wget (localhost también vale, evidentemente). Supongo que debe de haber alguna forma de decirle que los fuentes ya se encuentran descomprimidos en algún lugar y no hace falta descargarlos y tal, pero como a mi personalmente, ésta manera me viene bien, no me he preocupado en mirar mas.
Bueno, después de declarar éstas variables, se definen las secciones que componen el Makefile.
define Package/holamundo, define Package/holamundo/Default y define Package/holamundo/description contienen información para el menú de configuración (se verá mas adelante). El hecho de escribir Package/nombre_paquete/opcion en lugar de Package/opcion, como parecería mas lógico, es debido a que en un mismo Makefile podemos compilar varios paquetes, en caso de que existan dependencias (por poner un ejemplo), y de ésta forma se pueden definir distintas acciones para cada uno de ellos.
Build/Prepare se encarga de “preprocesar”, por así decirlo el paquete antes de compilarlo. Aquí en realidad es donde se descarga el paquete, se descomprime y tal. Todo ésto es llevado a cabo por el script Build/Prepare/Default, que es llamado automáticamente. Supongo que aquí es donde si quieremos, podemos decirle que lleve a cabo otras acciones (en lugar de descargar el paquete con wget, descomprimirlo, etc) o incluso dejarlo vacío si no queremos que haga nada.
Build/Compile se encarga de compilar el paquete y generar el ejecutable. Aquí es importante decir que en el Makefile del paquete a compilar (no en éste), debe utilizarse la variable CC para definir al compilador, ya que nuestro Makefile guardará ahí una referencia al compilador cruzado que se utiliza para compilar. En PROGRAMS indicamos qué paquetes (programas) se compilarán. Como en éste caso solo tenemos holamundo, pues lo escribimos y fuera.
Finalmente, en Package/holamundo/Install se definen las reglas para generar el paquete una vez compilado todo el código. En realidad se definen en qué directorio de la máquina destino se descomprimirá el paquete y cada uno de los archivos que forman dicho paquete (podriamos tener varios archivos de configuración o inicialización que irían a distintos subdirectorios dentro de la máquina). Opcionalmente, también se podrían escribir comandos que serían generados tras instalar.
Después de definido todo ésto, es cuando se lleva a cabo el proceso de compilación propiamente dicho, llamando al script BuildPackage. Éste script deberá llamarse una vez por cada paquete que vaya a ser generado.
Bueno, pues básicamente éste es el Makefile necesario para crear un paquete con la toolchain de OpenWrt. Éste makefile habrá que guardarlo dentro de la ruta package/holamundo
y desde ahí se compilará.
Configurando el Núcleo
Bueno, pues ya tenemos el Makefile correspondiente al paquete que queremos generar. Ahora, generaremos una Imagen nueva de OpenWrt y además, también compilaremos el SDK para compilar aplicaciones para ése núcleo (en realidad, el SDK para compilar aplicaciones compatibles con un núcleo determinado no tiene que ser tan específico, basta con elegir uno de la página de descargas que soporte nuestro micro. Por tanto, éste paso te lo puedes saltar si quieres).
ejecutando
-
make menuconfig
se abre la ventana de configuración del firmware, donde podemos encontrar entre otras opciones, la posibilidad de compilar nuestro paquete, que como configuramos anteriormente, se encuentra en la sección misc, como puede verse aquí:

y aquí puede verse el menú de ayuda:

Compilando
Una vez preparado todo, ya solo falta compilar:
-
make
Así de fácil. Ahora ya solo falta esperar a que el proceso concluya. Dependiendo de tu máquina (y de tu velocidad de conexion a internet), ésto puede llevar mas o menos tiempo. Un café y/o un par de capítulos de tu serie favorita te ayudadarán a mitigar la espera…
Hay que decir que la compilación tardará mas o menos tiempo dependiendo de los paquetes que configures para que sean instalados con tu “distribución” de OpenWrt. En la mayoría de los casos, (como es el caso de nuestro paquete holamundo), los fuentes deben ser descargados de la red y sus parches también, por lo que el proceso puede tardar bastante tiempo.
Terminando la compilación
Una vez que ha finalizado la descarga, podemos ir al directorio bin. Allí nos podremos encontrar con lo siguiente:
- openwrt-atheros-vmlinux.lzma y openwrt-atheros-root.squashfs: Imágenes para cargar en tu fonera con el firmware compilado.
- OpenWrt-SDK-atheros-for-Linux-i686.tar.bz2: Toolchain comprimida para compilar aplicaciones para ésa versión del firmware.
En realidad, si lo único que quieres hacer es compilar aplicaciones para tu fonera sin historias raras (historias raras == tener que compilarte tu propia imágen del sistema), todo lo anterior, a excpeción del Makefile no es necesario, pues te puedes bajar la toolchain ya precompilada, no siendo muy crítico el hecho de utilizar la de una versión del firmware para compilar aplicaciones en otra versión.
Compilando con la toolchain
Pues una vez que hemos descomprimido nuestra toolchain y hemos cambiado la ruta de TOPDIR a la nueva ruta en la que se encuentra la toolchain, procedemos a compilar nuestro paquete holamundo.
Lo primero que hacemos, es crearnos, dentro del directorio package un subdirectorio llamado holamundo donde copiaremos nuestro famoso Makefile. Vamos, ésto es igual que cuando compilamos la imagen de firmware. En realidad, para compilar la imágen del firmware no era necesario crear el paquete holamundo, yo lo hice ahí para que fuese un poco mas ilustrativo, pero nos podíamos haber saltado el paso, como bien he dicho antes, y generar (o descargar) una toolchain ya compilada.
Una vez que ya tenemos el subdirectorio listo, desde el raíz invocamos la compilación:
-
make package/holamundo/compile
Et voilá, se pondrá a compilar nuestro holamundo.
Si queremos ver el proceso con mas detalle:
-
make package/holamundo/compile V=99
Y también podemos hacer cosas como
-
make package/holamundo/clean
o
-
make package/holamundo/prepare
Bueno, pues después de haber compilado nuestro queridísimo holamundo, lo podremos ver en bin/packages/target-mips_uClibc-0.9.29/:
-
yo@miMaquina:~/toolkits/fonera/OpenWrt-SDK-atheros-for-Linux-i686$ ls -l bin/packages/target-mips_uClibc-0.9.29/
-
total 4
-
-rw-r–r– 1 yo yo 1859 abr 30 03:01 holamundo_0.1.1-1_mips.ipk
Y ahí está nuestro paquetito ipk listo para ser instalado, aunque éso ya será otra historia, que ahora es tarde….
Lo próximo…
Bueno, pues ahora falta configurar un servidor para que nos sirva, en forma de mirror, los paquetes ipk que creemos y configurar ipkg en nuestra fonera para poder instalar los paquetes de forma automágica….
No tardaremos
Referencias
Luego las pongo, que ahora ando cansaote….


