Monthly Archives: Marzo 2009

openWrt: Cómo compilar aplicaciones para la fonera

0
Filed under Embedded, Programación
Tagged as , , , ,

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?

Bueno, las especificaciones de la fonera se pueden encontrar en el siguiente enlace (no me voy a poner a reescribir lo ya escrito o poner fotitos de la fonera, hay mil por ahí).

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í:

  1. 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:

  1. 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.

  1. #
  2. # Copyright (C) 2006-2008 OpenWrt.org
  3. #
  4. # This is free software, licensed under the GNU General Public License v2.
  5. # See /LICENSE for more information.
  6. #
  7. # $Id$
  8.  
  9. include $(TOPDIR)/rules.mk
  10.  
  11. PKG_NAME:=holamundo
  12. PKG_VERSION:=0.1.1
  13. PKG_RELEASE:=1
  14. PKG_MD5SUM:=19a4d8bdc9bc7add4b3668969a546b68
  15. PKG_SOURCE_URL:=http://localhost
  16. PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
  17. #PKG_CAT:=zcat
  18.  
  19. PKG_BUILD_DIR:=$(BUILD_DIR)/holamundo-$(PKG_VERSION)
  20.  
  21. include $(TOPDIR)/rules.mk
  22. include $(INCLUDE_DIR)/kernel.mk
  23.  
  24. PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
  25.  
  26. include $(INCLUDE_DIR)/package.mk
  27.  
  28. define Package/holamundo
  29. SECTION:=Toys
  30. CATEGORY:=Misc
  31. TITLE:=A gadget to print greetings. Spanish flavour.
  32. URL:=http://localhost
  33. endef
  34.  
  35. define Package/holamundo/Default
  36. URL:=http://localhost
  37. endef
  38.  
  39. define Package/holamundo/description
  40. A message for help in menuconfig: You can write your help message here.
  41. endef
  42.  
  43. define Build/Prepare
  44. $(call Build/Prepare/Default)
  45. endef
  46.  
  47. define Build/Compile
  48. $(MAKE) -C $(PKG_BUILD_DIR)/src \
  49. $(TARGET_CONFIGURE_OPTS) \
  50. LD="$(TARGET_CC)" \
  51. PROGRAMS="holamundo" \
  52. MULTI=1 SCPPROGRESS=1
  53. endef
  54.  
  55. define Package/holamundo/install
  56. $(INSTALL_DIR) $(1)/usr/sbin
  57. $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/holamundo $(1)/usr/sbin/
  58. endef
  59.  
  60. $(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

  1. 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í:

Opciones de configuración de OpenWrt
y aquí puede verse el menú de ayuda:

Menu de ayuda

Compilando

Una vez preparado todo, ya solo falta compilar:

  1. 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:

    1. make package/holamundo/compile

    Et voilá, se pondrá a compilar nuestro holamundo.
    Si queremos ver el proceso con mas detalle:

    1. make package/holamundo/compile V=99

    Y también podemos hacer cosas como

    1. make package/holamundo/clean

    o

    1. 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/:

    1. yo@miMaquina:~/toolkits/fonera/OpenWrt-SDK-atheros-for-Linux-i686$ ls -l  bin/packages/target-mips_uClibc-0.9.29/
    2. total 4
    3. -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…. :-P

    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….