jueves, agosto 19

Hammer: Instalando linux en un dispositivo embebido

Me compré un nail kit en TinCanTools, para experimentar que tal funcionaba correr un pequeño linux en un sistema embebido.

La cosa es que una vez que lo tuve, me propuse instalar el entorno de desarrollo en una máquina virtual con ubuntu minimal (pura consola), lo cual no anduvo tan suavemente como hubiese querido.

Siguiendo el paso a paso encontrado en el Hammer Hello World Tutorial ocurrieron un par de detalles que hubo que resolver antes de tener el entorno andando.

Primero, había que bajar las fuentes para compilar el kernel:
wget http://www.elinux.org/upload/b/b6/Buildroot-01082008.tar.gz
wget http://www.elinux.org/images/f/ff/Hammer-linux-2.6.22-09122007.diff.gz
wget http://www.elinux.org/images/e/ef/Hammer-kernel-config
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.tar.gz
En el siguiente paso, comenzamos con la compilación de Buildroot:
tar xvzf Buildroot-01082008.tar.gz
cd buildroot
cp Hammer-config .config
make clean
make oldconfig
make
cd ..
Al hacer el make del paso anterior, se caía en un error en el archivo unifdef.c, en la cual la función getline ya está definida (conflicto de nombre con la función de stdio). Esto simplemente se soluciona renombrando la función a getline2.

Al hacer nuevamente un make, se caía en la parte donde trataba de bajar uClibc, esto se solucionó editando el valor de UCLIBC_SITE en ./toolchain/uClibc/uclibc.mk de http://www.uclibc.org/downloads a http://www.uclibc.org/downloads/old-releases

Otro make más, y ahora el sistema se caía al intentar bajar fakeroot, y de acuerdo a la instrucción del tutorial sólo bastaba con cambiar el número de la versión. Revisando en el FTP de debian me encontré que la última versión era la 1.14.4, pero viene empaquetada de una manera diferente del clásico tar.gz, por lo que decidí utilizar la 1.12.4 que viene empaquetada de esa manera y evitar mayores enredos con los scripts que lo procesan.

Al hacer nuevamente make, me arrojaba un error al parchar los archivos Makefile.in y Makefile.am, para salvar este obstáculo, reemplazamos el contenido de package/fakeroot/fakeroot-doc.patch con lo siguiente:
--- fakeroot/Makefile.am.orig 2006-04-19 11:50:35.000000000 -0600
+++ fakeroot/Makefile.am 2006-04-19 11:50:59.000000000 -0600
@@ -1,6 +1,6 @@
AUTOMAKE_OPTIONS=foreign
ACLOCAL_AMFLAGS = -I build-aux
-SUBDIRS=scripts doc test
+SUBDIRS=scripts test

noinst_LTLIBRARIES = libcommunicate.la
libcommunicate_la_SOURCES = communicate.c
--- fakeroot/Makefile.in.orig 2006-04-19 11:50:43.000000000 -0600
+++ fakeroot/Makefile.in 2006-04-19 11:51:21.000000000 -0600
@@ -244,4 +244,4 @@
AUTOMAKE_OPTIONS = foreign
ACLOCAL_AMFLAGS = -I build-aux
-SUBDIRS = scripts doc test
+SUBDIRS = scripts test
noinst_LTLIBRARIES = libcommunicate.la
Antes de realizar nuevamente el make, hay que borrar los archivos que *.rej que quedaron en build_arm/fakeroot-1.12.4

Luego, al hacer make, aparece un error en makedevs.c, el cual se soluciona reemplazando en la linea 531, el código
system("/bin/sync");
por
if(system("/bin/sync")) bb_error_msg("sync failed, continuing anyway");
con esto, finalmente, funcionó el make.

No hay comentarios.: