Propongo crear una base práctica de desarrollo de aplicaciones para OpenWrt Barrier Breaker, algo muy simple como incluir un "Hello World" creado en "C" dentro de una nueva pestaña de Luci llamada por ejemplo "Aprendizaje"...
Hasta ayer, yo tampoco había nunca compilado nada en C para OpenWrt, pero gracias a este documento
http://www.componentality.com/res/Step-By-Step-Instruction-To-Run-Apps-On-FlexRoad-HW.en.pdf pude por fin compilar un "Hello World". El documento tiene cinco páginas, está en inglés y tiene un error fácilmente subsanable que chafa la compilación. Todo el proceso se lleva a cabo en cuatro fases. Las tres primeras tienen lugar en el PC, que es donde propiamente se compila. La última fase consiste en la instalación del módulo ejecutable en el router, que es donde va a correr el programa. Compilar en una máquina (PC) para otra de distinta arquitectura (router) recibe el nombre de
compilación cruzada. Veamos los detalles.
(Las notas en violeta no figuran en el documento original)PRIMERA FASE: Instalación de programas en el PC Ubuntu1.1 Instalación del software de control de versiones (llamado SVN o sub-versión).
En una terminal teclear
sudo apt-get update
sudo apt-get install subversion build-essential
1.2 Crear el subdirectorio openwrt dentro de la carpeta home y abrirlo.
mkdir ~/openwrt
cd ~/openwrt
1.3 Descargar OpenWRT Barrier Breaker.
svn co svn://svn.openwrt.org/openwrt/branches/barrier_breaker
1.4 La descarga de Barrier Breaker crea una nueva carpeta. La abrimos.
cd barrier_breaker
1.5 Descargar e instalar todos los feeds disponibles.
./scripts/feeds update -a
./scripts/feeds install -a
1.6 Obtener una lista de los paquetes que faltan.
make menuconfig
1.7 Si todo va bien, aparecerá un menú de configuración que perfilamos para nuestro router.
Nota. (Ejemplo para el hg556a).Target System (Broadcom BCM63xx) --->
Subtarget (generic) --->
Target Profile (Huawei HG556a) --->
1.8 Guardar la configuración y salir.
1.9 Generar el entorno de compilación. Desde una terminal, nos posicionamos en el direcorio barrier_breaker.
make
Este proceso es lento. En los PC más antiguos puede tardar varias horas.
NOTA. Aprovecha la potencia de tu PC para acelerar el proceso. Utiliza el parámetro -j seguido del número de procesadores + 1. Ejemplo para una máquina de 4 núcleos:make -j 5
SEGUNDA FASE: Ensamblado.2.1 Crear una subcarpeta en para el código fuente dentro de la carpeta openwrt y abrirla.
mkdir ~/openwrt/hello
cd ~/openwrt/hello
2.2 Crear los ficheros hello.c y Makefile (la M en mayúscula).
Nota. Este Makefile es para generar un ejecutable para la máquina en la que se compila (el PC).touch hello.c
touch Makefile
Editar el fichero hello.c con el código fuente del programa.
#include <stdio.h>
void main()
{
printf("Hello, World!\n");
}
NOTA. El código fuente del documento original da un Warning al compilar. No es grave, pero puedes evitarlo utilizando este otro que, además, es más castizo.#include <stdio.h>
int main()
{
printf("Ola k ase\n");
return 0;
}
Editar el fichero Makefile (la M en mayúscula) con las instrucciones de compilación.
.SUFFIXES: .tar.gz .c
override CFLAGS += -Wall -O0 -g
hello:hello.c
all: hello hello.tar.gz
%.tar.gz: DIR=$(subst .tar.gz,,$@)
%.tar.gz: %.c
@mkdir -p ./$(DIR)-0.1
@cp $^ Makefile ./$(DIR)-0.1
tar -cz -f $@ ./$(DIR)-0.1
2.3 Compilar el programa y probar que funciona en el PC. Más adelante compilaremos para el router.
Seguimos en la carpeta ~/openwrt/hello. Compilamos y lanzamos.
make all
./hello
NOTA. Esta compilación no tarda nada en realizarse, pero también es posible acelerarla. Para una máquina con cuatro núcleos usa el parámetro -j 5.make -j 5 all
NOTA. Al ejecutar el programa en el PC (./hello) se visualiza el texto "Hello, World!" Esto indica que el programa compila y se ejecuta bien en el entorno PC. Ahora toca compilar para el router.2.4 Crear la carpeta "hello" en ~/openwrt/barrier_breaker/feeds/packages/utils y abrirla.
mkdir ~/openwrt/barrier_breaker/feeds/packages/utils/hello
cd ~/openwrt/barrier_breaker/feeds/packages/utils/hello
2.5 Crear un fichero Makefile.
NOTA. La M en mayúscula. En el documento original en inglés está en minúscula y da errores al compilar.Nota. Este Makefile es distinto al del punto 2.2. Contiene las instrucciones para que el compilador genere un ejecutable específico para la máquina objetivo (el router).touch Makefile
Edita el fichero Makefile con las instrucciones para la
compilación cruzada.
include $(TOPDIR)/rules.mk
PKG_NAME:=hello
PKG_VERSION:=0
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(PKG_NAME)-$(PKG_VERSION).$(PKG_RELEASE)
PKG_SOURCE:=hello.tar.gz
PKG_SOURCE_URL:=file:///home/usuario/openwrt/hello/
include $(INCLUDE_DIR)/package.mk
define Package/hello
SECTION:=utils
CATEGORY:=Utilities
TITLE:=HW
endef
define Package/hello/description
Hello World
endef
define Package/hello/Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) hello
endef
define Package/hello/install
$(INSTALL_DIR) $(1)/bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/hello
endef
$(eval $(call BuildPackage,hello))
¡ATENCIÓN! En la línea
PKG_SOURCE_URL:=file:///home/usuario/openwrt/hello/ asegurarse de cambiar el nombre del
usuario por el que realmente tenemos en Linux.
NOTA. No hace falta explicitar el nombre del usuario si se cambia la línea original por esta otra.PKG_SOURCE_URL:=file:///~/openwrt/hello/
TERCERA FASE. COMPILACIÓN.3.1 Abrir la carpeta ~/openwrt/barrier_breaker, actualizar e instalar feeds.
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
3.2 Abrir el menú de configuración.
make menuconfig
3.2 Buscar el paquete "hello" y marcarlo con una [M].
Utilities ----> hello
(pulsar la barra de espacios para marcarlo con una M)
3.3 Salir y guardar los cambios.
(Exit, Exit y Yes)
3.4 ¡Compilar para nuestro router OpenWRT!
make package/hello/compile
NOTA. Esta compilación es rápida, pero también se puede acelerar. Para una máquina con cuatro núcleos usa el parámetro -j 5.make -j 5 package/hello/compile
Si la compilación termina con éxito, se habrá creado un paquete hello_0-1_brcm63xx.ipk con el ejecutable en la carpeta ~/openwrt/barrier breaker/bin/
nuestro_router/packages/packages
CUARTA FASE. Traslado del paquete al router, instalación y prueba.4.1 Copiar el fichero hello_0-1_brcm63xx.ipk en la carpeta /tmp del router.
NOTA. Desde Windows es cómodo copiarlo con WinSCP. Desde Linux se puede utilizar SCP.4.2 Abrir una sesión ssh en el router e instalar el paquete.
cd /tmp
opkg install hello_0-1_brcm63xx.ipk
NOTA. En Windows es cómodo instalar desde PuTTY. Desde Linux se puede instalar abriendo una sesión ssh.ssh root@192.168.1.1
4.3 Desde PuTTY o ssh, ejecutar el programa.
hello
Si todo está bien, aparecerá el mensaje "Hello, World!" ("Ola k ase" en la versión corregida y aumentada).
Saludos.