Skip to Content

Mi primer port en Ben NanoNote: gnuchess (Tutorial)


He tenido algo de tiempo para poderle dedicar a algo que tenia curiosidad desde que tuve el NanoNote y es como portar aplicaciones usando el entorno de OpenWRT, asi que basándome en los manuales y tutoriales de Qi Hardware y OpenWRT, me marque el objetivo de portar una aplicación sencilla sin muchas dependencias y que no estubiera ya en los repositorios, asi que me acorde del un viejo amigo (Steve esta va por ti :P) y elegí gnuchess, a continuación os detallo los paso que he seguido para tener un lindo paquete para instalar en el NanoNote

Puesta a punto del entorno y compilacion de la toolchain
en Ubuntu/Debian los paquetes necesarios para empezar a trabajar con OpenERT se consigen ejecutando
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make gettext unzip libz-dev libc6 ncurses-dev subversion libxml-simple-perl gawk git-core

Crearemos una carpeta donde guardaremos todo lo relacionado con OpenWRT, y nos descargaremos el entorno con git desde los repositorios de qi-hardware para estar a la ultima y poder actualizarnos en un futuro.


mkdir openwrt
cd openwrt
git clone git://projects.qi-hardware.com/openwrt-xburst.git
cd openwrt-xburst
git fetch origin
git checkout --track -b xburst origin/xburst
make menuconfig

Aqui se nos abrira un menu grafico, Este es el menu de configuracion de OpenWRT, como veis esta basado en el tipico menu de configuracion del kernel, aqui podremos seleccionar los paquetes que queremos compilar y un monton de parametros para generar un firmware a nuestra medida, de momento nos nos centraremos en seleccionar la plataforma de destino.

En Target selecionamos "Ingenic Xburst" que es la platafoma de nuestro Ben Nanonote

Seleccionamos exit y cuando nos pregunte le diremos que si guardamos los cambios

Podremos volver a este menu ejecutando "make menuconfig"
Para compilar la toolchain y de rebote tambien el ultimo kernel y un cojunto de paquetes basico solo teneis que ejecutar

make

si solo quereis la toolchain entonces ejecutar

make toolchain

Crear un paquete en OpenWRT
En OpneWRT los paquetes se definen con un archivo Makefile, no entraremos en detalle de tooodos los paratametros y funciones que se pueden definir dentro del achivo, hemos cogido el ejemplo de aqui y lo hemos modificado para  nuestro paquete.

ahora crearemos una carpeta para crear nuestros paquetes para evitar liarla lo menos posible en el entorno de OpenWRT,fuera de la carpeta "openwrt-xburst" ,esta carpeta le podeis dar el nombre que querais

cd ..
mkdir mutroxports

como tengo intencion de ,si las autoridades y el tiempo lo permite, de crear varios ports, dentro de esta carpeta creare otra carpeta para juegos
mkdir mutroxports/games
y una carpeta para el paquete en cuestion
mkdir mutroxports/games/gnuchess
y crearemos un archivo Makefile con nuestro editor favorito en mi caso joe
joe mutroxports/games/gnuchess/Makefile

las lineas con # son comentarios que añadido para explicar brevemente cada apartado

# Copyright (C) 2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
#

include $(TOPDIR)/rules.mk
##Nombre del paquete
PKG_NAME:=gnuchess
## version del programa que vamos incluir en el paquete
PKG_VERSION:=5.07
## numero de version del paquete 
PKG_RELEASE:=3
##Nombre del archivo con el codigo fuente usamos las variables que acabamos de definir
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
##Url donde se encuetra el el codigo fuente
PKG_SOURCE_URL:=http://ftp.gnu.org/pub/gnu/chess
## programa con el que descomprimir el codigo fuente
PKG_CAT:=zcat

include $(INCLUDE_DIR)/package.mk
#Definicion del paquet Titulo, seccion, categoria, la url del proyecto,
#esto se usa para generar el ipkg y para incluirlo en el menuconfig
define Package/gnuchess
  TITLE:=Chess GNU from FSF
  SECTION:=games
  CATEGORY:=Games
  URL:=http://www.gnu.org/software/chess/chess.html
endef
#El directorio donde extraeremos los fuentes y realizaremos la compilacion
#BUILD_DIR es una variable de etorno de OpenWrt es donde descomprimen/compilan los paquetes
PKG_BUILD_DIR:=$(BUILD_DIR)/gnuchess-$(PKG_VERSION)
#Descripcion larga del programa
define Package/gnuchess/description
  GNU Chess lets most modern computers play a full game of chess. It has a plain terminal interface but supports visual interfaces such as xboard and eboard
endef
#Si no hay que darles instrucciones especiales al ./configure esto se queda tal como esta.
define Build/Configure
      $(call Build/Configure/Default)

endef
#Definimos donde se copiaran los binarios y las librerias cuando queramos instalarlo,
#gnuchess genera el binario en el directorio src
define Package/gnuchess/install
    $(INSTALL_DIR) $(1)/usr/sbin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/gnuchess $(1)/usr/sbin/
endef
#Instrucion final para construir el paquete.
$(eval $(call BuildPackage,gnuchess))

Guardamos y volvemos a la carpeta openwrt-xburst donde activaremos nuestro directorio como un feed.

Paquetes de terceros, los feeds
OpenWRT incluye una manera facil de agregar paquetes no incluidos en sus propios repostiorios, nosotros incluiremos nuestro directorio como feed,
en el directorio openwrt-xburst
cp feeds.conf.default feeds.conf
con esto activaremos los feeds por defecto en OpenWRT y aumentaran el numero de paquetes disponibles
añadiremos esta linea al final del archivo feeds.conf
src-link mutroxports /ruta/donde/hayais/creado/la/carpeta/openwrt/mutroxports
ahora los paquetes de los feeds a nuestro entorno OpenWRT
./scripts/feeds update
./scripts/feeds install -p mutroxports

y el siguiente paso ya es compilar nuestro paquete, podemos o bien seleccionarlo en el menuconfig, que gracias a la magia negra de OpenWRT ha generado un nuevo apartado llamado Games, tal como habiamos definido en el Makefile en la variable CATEGORY

<M> significa solo generar paquete, <*> significa generar paquete y incluir dentro del firmware
Generar un firmware entero no es el objetivo de este tutorial, asi que lo dejaremos en
<M>
Asi en nuestro proximo make tambien se generar este paquete.

También podemos directamente generar solo el paquete sin tener que recompilarlo todo

make package/gnuchess/compile

OOOH no funcionaaa... da un errooorr,(soy malo, verdad?)
Para ver la causa de error podemos compilar usando
make package/gnuchess/compile V=99
esto suele pasar, ya que muchos programas no estan pensados para otras aquitecturas o para hacer crosscompiling en este caso el arreglo es sencillo y nos da pie a presentar el ultimo punto antes de crear el paquete.

Parches, solucionando errores y adaptando el código
En la carpeta donde tenemos definido nuestro Makefile también podemos incluir una carpeta llamada patches, en ella incluiremos las modificaciones necesarias para que el programa compile si da errores, aligerarlo si es muy pesado, para hacerlo adaptable a resoluciones mas pequeñas... en fin todo lo que haya que hacerle al codigo fuente base para que se adapte a nuestro aparatito objetivo.
En nuestro ejemplo el problema lo da una diferencia en la definicion de tipos entre una cabecera common.h y un archivo input.c, en la linea 719 del archivo common.h hay que cambiar extern por static , para generar el archivo patch he echo lo siguiente, en una carpeta temporal, a poder ser lejos de las que hemos creado hasta ahora para no liarla.
descargarme las fuentes originales
wget http://ftp.gnu.org/pub/gnu/chess/gnuchess-5.07.tar.gz
descomprimirlas
tar -xzf gnuchess-5.07.tar.gz
hacer una copia de la carpeta
cp gnuchess-5.07 gnuchess-5.07.mod
modificar el archivo en cuestion dentro de la carpeta gnuchess-5.07.mod
joe gnuchess-5.07.mod/src/common.h
y generar el parche con la siguiente instrucción
diff -crB gnuchess-5.07 gnuchess-5.07.mod > 001_static_definition.patch

y ya tenemos el parche creado, los tres numero delante del archivo son para controlar que los parches se ejecuten en un orden concreto si existe mas de un parche a aplicar, pero en este caso solo tenemos 1
Si alguien conoce una manera mas cómoda de generar los parches soy todo oidos :P

Creamos una carpeta patches en el directorio del paquete gnuchess
mkdir /dondeseaqueeste/openwrt/mutroxports/games/gnuchess/patches
cp 001_static_definition.patch /dondeseaqueeste/openwrt/mutroxports/games/gnuchess/patches

y ahora si volvemos a la carpeta openwrt-xburst y ejecutamos
make package/gnuchess/clean
make package/gnuchess/compile
make package/gnuchess/install

y si todo ha ido bien en la carpeta bin/xburst/packages encontrareis un flamante paquete ipkg como el que podéis encontrar en http://tuxbrain.org/downloads/nanonote/packages :)

En http://tuxbrain.org/downloads/nanonote/mutroxports podéis encontrar el Makefile y el parche generado

Este tutorial has sido escrito deprisa y corriendo y de noche a altas horas de la madrugada, asi que cualquier error que podais encontrar añadirlo a los comentarios  y lo corregiré lo antes posible :)