?>/script>'; } ?> Base práctica de desarrollo Widgets Magazine

Autor Tema: Base práctica de desarrollo  (Leído 27500 veces)

0 Usuarios y 1 Visitante están viendo este tema.

seny

  • Visitante
Base práctica de desarrollo
« en: 03-01-2015, 16:30 (Sábado) »
Hola, creo que en este foro pueden haber bastantes de nosotros con ideas para aplicar y ciertos conocimientos de programación en C, pero es complicado encontrar la forma de desarrollarlos dentro de OpenWrt.

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

Yo de momento no sabría hacerlo, hago esta propuesta para comprobar que aceptación podría tener algo así y si habría alguien dispuesto a realizarlo.

Simplemente clickarias en la nueva pestaña y mostraria el mensaje "Hello World" en una nueva pantalla en blanco.  ;D

Dispondriamos dentro de la carpeta que usamos actualmente para compilar firmwares para nuestro router, de una nueva carpeta donde encontrariamos lo mínimo para que ese HelloWorld.c funcione y podamos desarrollar lo que queramos, compilandose dentro de nuestro firmware.

Saludos.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Base práctica de desarrollo
« Respuesta #1 en: 03-01-2015, 17:55 (Sábado) »
No sé si te refieres a que helloworld.c se compile y ejecute cuando pulsas la pestaña de luci o a que cuando compilemos, ese programa se incluya en nuestro firmware y se ejecute al pulsar la pestaña.

Para lo primero:
No existe ningún toolchain para desarrollar openwrt dentro de openwrt. La mayor parte de las herramientas de compilación simplemente no están adaptadas para funcionar en openwrt. Es por eso por lo que hemos de compilar en un PC para producir código ejecutable en mips.
He intentado de muchas formas buscar un toolchain adecuado para poder desarrollar en openwrt en C, pero al final lo tuve que dejar porque no he encontrado nada medianamente decente sobre lo que poder empezar.
Alguna gente ha conseguido, en una máquina virtual mips bajo QEMU, con debian mips, compilar programas como MLDonkey, pero hacerlo desde el propio openwrt es por ahora una odisea (si es que se puede hacer).
Si alguien tiene alguna idea o alguna aportación, desde luego que estaría más que agradecido de que la compartiera por aquí.

Para lo segundo, ya hay documentación de cómo hacer pequeñas aplicaciones que generen paquetes instalables: https://forum.openwrt.org/viewtopic.php?id=44846

seny

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #2 en: 03-01-2015, 18:47 (Sábado) »
Ya conocia las limitaciones que hay para compilar desde el router y mi propuesta era crear una aplicación práctica de lo que comentan en ese link, añadiendo que funcione desde Luci y ya incluida en Barrier Breaker.

Añadir la carpeta con el helloword.c y todo lo necesario para crear la pestaña "Aprendizaje" en el Luci, incluida en el source que bajamos, poderlo modificar y que forma parte de las opciones del menuconfig que lo incluya o no en la compilación que hagamos desde el PC.

Quizás si para empezar se incluyese eso en el siguiente branch sobre la versión oficial que se realize, es una idea que lanzo a ver que tal y creo que con eso algunos podriamos empezar a investigar.
saludos

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Base práctica de desarrollo
« Respuesta #3 en: 03-01-2015, 21:42 (Sábado) »
Ya conocia las limitaciones que hay para compilar desde el router y mi propuesta era crear una aplicación práctica de lo que comentan en ese link, añadiendo que funcione desde Luci y ya incluida en Barrier Breaker.

Añadir la carpeta con el helloword.c y todo lo necesario para crear la pestaña "Aprendizaje" en el Luci, incluida en el source que bajamos, poderlo modificar y que forma parte de las opciones del menuconfig que lo incluya o no en la compilación que hagamos desde el PC.

Quizás si para empezar se incluyese eso en el siguiente branch sobre la versión oficial que se realize, es una idea que lanzo a ver que tal y creo que con eso algunos podriamos empezar a investigar.
saludos

Yo crearía un paquete para tenerlo disponible cuando quisiera de la forma antes mencionada, ya que no creo que vayamos a flashear el router entero cada vez que queramos compilar el paquete. Si lo compilamos como paquete lo podemos instalar y desinstalar las veces que queramos sin perder espacio en la flash (cosa que sí sucederá si lo metemos en la imagen y después volvemos a cargar el paquete).
Para ejecutarlo no hay más que instalar el luci-app-commands y darle a ejecutar desde ahí. Vamos, que la parte de luci ya está hecha...  ^-^

seny

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #4 en: 05-01-2015, 14:07 (Lunes) »
Menudo lio  :D y es dificil de exponer, lo mejor seria que alguien más lo probase..

Da error al compilar y solo he encontrado una forma que lo intenta ya que siguiendo los pasos del link anterior, situando helloworld dentro de openwrt/feeds/packages/utils el feeds install no lo instala, explico como lo hago desde la carpeta inicial vacia:

git clone git://github.com/openwrt-es/openwrt.git -b bb-14.07-rc3
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make prereq

coloco la carpeta helloworld dentro de openwrt/package/utils, solo contiene este Makefile:
Código: [Seleccionar]
include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_VERSION:=1.0.0
PKG_RELEASE:=1

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)   
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=$(PKG_NAME)
    MAINTAINER:=Mazilo <myEmail.add>
endef

define Package/$(PKG_NAME)/description
    This is a hello world package that contains a program to only print "hello world".
endef

CONFIGURE_VARS+= \
    CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)"

define Package/$(PKG_NAME)/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(CP) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin
endef

$(eval $(call BuildPackage,$(PKG_NAME)))
creo el helloworld-1.0.0.tar.xz con este Makefile y helloworld.c
Makefile:
Código: [Seleccionar]
helloworld: helloworld.o
        $(CC) $(LDFLAGS) helloworld.o -o helloworld

helloworld.o: helloworld.c
        $(CC) $(CFLAGS) -c helloworld.c

clean:
        rm *.o helloworld
helloworld.c
Código: [Seleccionar]
#include <stdio.h>
int main(void)
{
        printf("Hello World\n");
        return 0;
}
Lo sutuo dentro de la carpeta que he definido como download folder en advanced configuration del menuconfig.

ejecuto: ./scripts/feeds install helloworld

entro en make menuconfig y aparece helloworld en utilidades, lo selecciono y salgo guardando.

ejecuto: make package/utils/helloworld/compile V=s

Citar
manel-5m@manel5m-Inspiron-500m:~/wrtar/openwrt$ make package/utils/helloworld/compile V=s
make[1]: Entering directory `/home/manel-5m/wrtar/openwrt'
make[2]: Entering directory `/home/manel-5m/wrtar/openwrt/package/libs/toolchain'
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libc" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libgcc" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
WARNING: skipping libssp -- package not selected
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libstdcpp" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libpthread" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "libthread-db" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "librt" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
WARNING: skipping libgfortran -- package not selected
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "ldd" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
if [ -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean ]; then rm -f /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install.clean; fi; echo "ldconfig" >> /home/manel-5m/wrtar/openwrt/staging_dir/target-mips_mips32_uClibc-0.9.33.2/pkginfo/toolchain.default.install
make[2]: Leaving directory `/home/manel-5m/wrtar/openwrt/package/libs/toolchain'
make[2]: Entering directory `/home/manel-5m/wrtar/openwrt/package/utils/helloworld'
Makefile:31: *** missing separator.  Stop.
make[2]: Leaving directory `/home/manel-5m/wrtar/openwrt/package/utils/helloworld'
make[1]: *** [package/utils/helloworld/compile] Error 2
make[1]: Leaving directory `/home/manel-5m/wrtar/openwrt'
make: *** [package/utils/helloworld/compile] Error 2

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Base práctica de desarrollo
« Respuesta #5 en: 06-01-2015, 17:36 (Martes) »
El makefile del ejemplo no sé para qué versión de openwrt era. Supongo que habrá que adaptar algo.
De todas formas el error está muy localizado. Es la última línea de makefile. ¿Por qué no miras otro archivo makefile y ves si la llamada eval ha cambiado de forma y lo adaptas?

seny

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #6 en: 07-01-2015, 00:37 (Miércoles) »
Pues si, me ha sido mucho más facil a partir de un existente, concretamente he usado la base de uno sencillo, el usbreset y he podido crear un helloworld que se compila, agradecido por los apuntes.
saludos

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #7 en: 11-01-2015, 12:23 (Domingo) »
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 Ubuntu

1.1 Instalación del software de control de versiones (llamado SVN o sub-versión).

En una terminal teclear
Código: [Seleccionar]
sudo apt-get update
sudo apt-get install subversion build-essential

1.2 Crear el subdirectorio openwrt dentro de la carpeta home y abrirlo.
Código: [Seleccionar]
mkdir ~/openwrt
cd ~/openwrt

1.3 Descargar OpenWRT Barrier Breaker.
Código: [Seleccionar]
svn co svn://svn.openwrt.org/openwrt/branches/barrier_breaker
1.4 La descarga de Barrier Breaker crea una nueva carpeta. La abrimos.
Código: [Seleccionar]
cd barrier_breaker
1.5 Descargar e instalar todos los feeds disponibles.
Código: [Seleccionar]
./scripts/feeds update -a
./scripts/feeds install -a

1.6 Obtener una lista de los paquetes que faltan.
Código: [Seleccionar]
make menuconfig
1.7 Si todo va bien, aparecerá un menú de configuración que perfilamos para nuestro router.
Nota. (Ejemplo para el hg556a).
Citar
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.
Código: [Seleccionar]
makeEste 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:
Citar
make -j 5


SEGUNDA FASE: Ensamblado.

2.1 Crear una subcarpeta en para el código fuente dentro de la carpeta openwrt y abrirla.
Código: [Seleccionar]
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).
Código: [Seleccionar]
touch hello.c
touch Makefile

Editar el fichero hello.c con el código fuente del programa.
Citar
#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.
Citar
#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.
Código: [Seleccionar]
.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.
Código: [Seleccionar]
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.
Citar
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.
Código: [Seleccionar]
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).
Código: [Seleccionar]
touch Makefile
Edita el fichero Makefile con las instrucciones para la compilación cruzada.
Código: [Seleccionar]
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.
Citar
PKG_SOURCE_URL:=file:///~/openwrt/hello/


TERCERA FASE. COMPILACIÓN.

3.1 Abrir la carpeta ~/openwrt/barrier_breaker, actualizar e instalar feeds.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello

3.2 Abrir el menú de configuración.
Código: [Seleccionar]
make menuconfig
3.2 Buscar el paquete "hello" y marcarlo con una [M].
Citar
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!
Código: [Seleccionar]
make package/hello/compileNOTA. 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.
Citar
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.
Código: [Seleccionar]
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.
Citar
ssh root@192.168.1.1

4.3 Desde PuTTY o ssh, ejecutar el programa.
Código: [Seleccionar]
hello
Si todo está bien, aparecerá el mensaje "Hello, World!" ("Ola k ase" en la versión corregida y aumentada).



Saludos.
« Última modificación: 30-01-2015, 12:25 (Viernes) por raphik »

seny

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #8 en: 11-01-2015, 18:35 (Domingo) »
Gracias raphik, ha quedado mucho más claro el procedimiento.
saludos

Desconectado jar229

  • Moderador
  • *
  • Mensajes: 4607
Re: Base práctica de desarrollo
« Respuesta #9 en: 12-01-2015, 09:07 (Lunes) »

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #10 en: 12-01-2015, 15:05 (Lunes) »
Le he hecho algunas correcciones a la guía porque daba errores en una máquina x64 con Ubuntu 14.04 LTS.

Saludos.

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #11 en: 13-01-2015, 12:23 (Martes) »
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ make all
usuario@PC:~/openwrt/hello ./hello

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.
« Última modificación: 14-01-2015, 23:13 (Miércoles) por raphik »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Base práctica de desarrollo
« Respuesta #12 en: 13-01-2015, 13:49 (Martes) »
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ [b]make all[/b]
usuario@PC:~/openwrt/hello [b]./hello[/b]

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.


Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #13 en: 14-01-2015, 14:54 (Miércoles) »
Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).

Sí, lo ha comprobado. Desinstalo "hello" desde LuCI (System - Software - Pestaña Installed Packages) y borro el paquete hello_0-1_brcm63xx.ipk de la carpeta /tmp. Compruebo que no se ejecuta desde la línea de comados. Incluso lo busco con find. Segurísimo de que no está.
Código: [Seleccionar]
find / -name "hello*"
Borro el paquete ipk del router, hago cambios en hello.c, lo compilo, subo el paquete al router, lo instalo y ¡ZAS! aparece la primera versión de "hello".

Ya reportaré algo si averiguo qué está pasando.

Saludos.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Base práctica de desarrollo
« Respuesta #14 en: 14-01-2015, 17:24 (Miércoles) »
Puede ser una tontería, pero ¿has comprobado que en el router no haya más de un "hello" ejecutable? Puede que el que estés ejecutando sea el anterior porque el router lo encuentre antes en el path de ejecución. Pon el path absoluto para ejecutarlo /usr/bin/hello (o donde quiera que lo hayas metido)
Comprueba también que el paquete ipk contiene la versión última que acabas de compilar (se puede abrir con WinRAR).

Sí, lo ha comprobado. Desinstalo "hello" desde LuCI (System - Software - Pestaña Installed Packages) y borro el paquete hello_0-1_brcm63xx.ipk de la carpeta /tmp. Compruebo que no se ejecuta desde la línea de comados. Incluso lo busco con find. Segurísimo de que no está.
Código: [Seleccionar]
find / -name "hello*"
Borro el paquete ipk del router, hago cambios en hello.c, lo compilo, subo el paquete al router, lo instalo y ¡ZAS! aparece la primera versión de "hello".

Ya reportaré algo si averiguo qué está pasando.

Saludos.

Comprueba también el paquete ipk que se genera, a ver si contiene la versión nueva o la vieja.
Intenta borrar el directorio de compilación de hello antes de compilar, por si están quedando residuos de una compilación a otra. Creo que está en build_dir.
Intenta también "make package/hello/clean"

seny

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #15 en: 16-01-2015, 18:41 (Viernes) »
No lo entiendo, ayer iba todo bien y hoy no. He hecho cambios en el fichero hello.c.

Lo compilo para el PC y lo lanzo para asegurarme de que funciona.
Código: [Seleccionar]
usuario@PC:~/openwrt/hello$ make all
usuario@PC:~/openwrt/hello ./hello

Cambio de carpeta, actualizo los feeds, selecciono el paquete y lo vuelvo a compilar para el router.
Código: [Seleccionar]
cd ~/openwrt/barrier_breaker
./scripts/feeds update -i
./scripts/feeds install hello
make menuconfig
make package/hello/compile

Traslado el fichero hello_0-1_brcm63xx.ipk a la carpeta /tmp del router, lo instalo y lo ejecuto.
Código: [Seleccionar]
opkg install hello_0-1_brcm63xx.ipk
hello

Y el resultado que me aparece en pantalla es el del primer Hello World que compilé, que no tiene nada que ver con el nuevo código.... Es como si hubiese compilado otra vez el fichero fuente de ayer, lo cual es imposible porque no existe.

¿Alguna pista de lo que está pasando?

Saludos.

Compila con V=s para ver si te da error al compilar, porque a mi en la carpeta feeds no me compila nada.
Una cosa me ha quedado clara con mis pruebas es que compilar source que ya exista o añado nuevo en feeds/packages/ da error.
Lo que compilo sea existente o nuevo en la carpeta package/ no da problema.
saludos

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #16 en: 30-01-2015, 14:13 (Viernes) »
Hola, creo que en este foro pueden haber bastantes de nosotros con ideas para aplicar y ciertos conocimientos de programación en C, pero es complicado encontrar la forma de desarrollarlos dentro de OpenWrt.

Está claro que el C es mucho más potente que cualquier script, pero hay situaciones en las que un simple script puede bastar.

Un script tipo "Hello World!" sería algo así:
Fichero /root/hello.sh
Código: [Seleccionar]
#!/bin/sh
echo "Hello, World!"
exit

La línea #!/bin/sh es imprescindible para que hello.sh funcione como un comando. También es necesario asignarle permiso de ejecución:
Código: [Seleccionar]
chmod +x /root/hello.sh
Para ejecutarlo:
Citar
/root/./hello.sh

Es posible pasarle parámetros al script. Unas variables especiales recogen el valor de los parámetros. $1 almacena el primer parámetro, $2 el segundo... y así sucesivamente. $0 guarda el nombre del propio script.
Código: [Seleccionar]
#!/bin/sh
case $1 in
ES) echo "¡Hola, Mundo!" ;;
FR) echo "Bonjour le Monde !" ;;
DE) echo "Hallo Welt!" ;;
PT) echo "Olá Mundo!" ;;
IT) echo "Ciao Mondo!" ;;
*) echo "Hello, World!" ;;
esac
exit

Al invocarlo desde la línea de comandos producirá una salida distinta según el parámetro que se le pase:
Citar
/root/./hello.sh ES => ¡Hola, Mundo!
/root/./hello.sh PT => Bonjour le Monde
/root/./hello.sh DE => Hallo Welt!
...

También es posible hacer que el script devuelva un valor numérico entre 0 a 255 utilizando la sentencia exit n ( 0 ≤ n ≤ 255 ).

Por lo general un comado devuelve 0 si acaba con éxito y cualquier otro valor en caso contrario.

Linux almacena el valor devuelto en una variable especial llamada $? Veamos un ejemplo. El comando ls <fichero> devuelve 0 si <fichero> existe. Si no existe, devuelve 1.
Código: [Seleccionar]
ls seguroqueesteficheronoexiste
echo $?
echo $?

Aunque parece obvio, es preciso tener en cuenta que $? contendrá el valor retornado por el último comando invocado. En el ejemplo, si el fichero no existe, el primer echo $? devolverá 1 y el segundo un 0, ya que el comando anterior (echo, que no ls) terminó con éxito.

Saludos.
« Última modificación: 02-02-2015, 09:48 (Lunes) por raphik »

raphik

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #17 en: 02-02-2015, 11:22 (Lunes) »
Para ilustrar lo que se puede hacer con un script, cuelgo uno que resuelve sudokus. Cualquier sudoku.

Para instalaro:
Código: [Seleccionar]
wget -qO - http://galeon.com/raphik/sudoku.tar | tar -xvf - -C /
Para resolver un sudoku como éste:
    ----- ----- -----
   | 6 3 |  1  | 7 4 |
   |  2  | 6 7 |  3  |
   | 5 4 |  2  |   1 |
    ----- ----- -----
   |  6  | 8   | 2   |
   | 3 1 |  9  |  8  |
   |  9  |   1 |   6 |
    ----- ----- -----
   | 9 6 |  8  | 1 2 |
   |  1  | 7 2 |  9  |
   | 2 7 |  6  |   8 |
    ----- ----- -----

teclear en la línea de comandos:
Código: [Seleccionar]
/root/sudoku.sh 603010704020607030504020001060800200301090080090001006906080102010702090207060008
Tras unos segundos se visualizará:
Citar
Sudoku resuelto en 7 segundos.
 ----- ----- -----
| 683 | 915 | 724 |
| 129 | 647 | 835 |
| 574 | 328 | 961 |
 ----- ----- -----
| 765 | 834 | 219 |
| 341 | 296 | 587 |
| 892 | 571 | 346 |
 ----- ----- -----
| 956 | 483 | 172 |
| 418 | 752 | 693 |
| 237 | 169 | 458 |
 ----- ----- -----

Saludos.
« Última modificación: 03-02-2015, 10:34 (Martes) por raphik »

raphik

  • Visitante
El servidor web de OpenWrt
« Respuesta #18 en: 03-02-2015, 10:21 (Martes) »
Nuestro router OpenWrt permite alojar páginas web que pueden ser visualizadas desde la red. Los ficheros .html hay que situarlos en la carpeta /www del router.

Un ejemplo sencillo.
/www/hello.html
Código: [Seleccionar]
<html><body>
Hello, World!
</body></html>

Puedes descargar e instalarlo tecleando
Código: [Seleccionar]
wget -qO - http://galeon.com/raphik/hello_web.tar | tar -xvf - -C /
Para visualizarlo, escribe en el navegador de Internet (si fuera necesario, sustituye la IP por la de tu router)
Citar
192.168.1.1/hello.html

O click aquí http://192.168.1.1/hello.html

Saludos.
« Última modificación: 03-02-2015, 11:03 (Martes) por raphik »

danitool

  • Visitante
Re: Base práctica de desarrollo
« Respuesta #19 en: 07-02-2015, 23:56 (Sábado) »
Interesante hilo. Trataré de exponer un método si cabe más sencillo. Como el helloworld aburre pondré algo más picante. Nuestra aplicación se llamará tp0set

La cual consiste únicamente en este código
Citar
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <mtd/mtd-user.h>
#include <string.h>

#define DATA_OFFSET 20      //the offset of the MTD partition where we will write
#define RAWBYTES_LEN 4

int main()
{
    mtd_info_t mtd_info;           // the MTD structure
    erase_info_t ei;               // the erase block structure
    int i;
    unsigned int rawBytes; //the bytes we want to write
    
    rawBytes = 0x00000000;

    unsigned char read_buf[0x20000] = {0x00};    // empty array for reading

    int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and
                                        // writing. Note you want mtd0 not mtdblock0
                                        // also you probably need to open permissions
                                        // to the dev (sudo chmod 777 /dev/mtd0)

    ioctl(fd, MEMGETINFO, &mtd_info);   // get the device info

    // dump it for a sanity check, should match what's in /proc/mtd
    printf("MTD Type: %x\nMTD total size: %x bytes\nMTD erase size: %x bytes\n",
         mtd_info.type, mtd_info.size, mtd_info.erasesize);

    lseek(fd, 0, SEEK_SET);               // go to the first block
    read(fd, read_buf, sizeof(read_buf)); // read and store CFE in read_buf
    memcpy(read_buf + DATA_OFFSET, (unsigned char*)&rawBytes, RAWBYTES_LEN); //write some bytes to CFE
    
    ei.length = mtd_info.erasesize;   //set the erase block size
    for(ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length)
    {
        ioctl(fd, MEMUNLOCK, &ei);
         printf("Eraseing Block %#x\n", ei.start); // show the blocks erasing
                                                  // warning, this might print a lot!
        ioctl(fd, MEMERASE, &ei);
    }

    lseek(fd, 0, SEEK_SET);        // go back to first block's start
    write(fd, read_buf,  sizeof(read_buf)); // write our modified CFE

    close(fd);

    printf("Done!!\n");
    
    return 0;
}

código que estará alojado en un fichero que nombraremos como main.c

y su archivo Makefile (el encargado de compilarlo)
Citar
PROGS     = tp0set

INSTDIR   = $(prefix)/usr/bin
INSTMODE  = 0755
INSTOWNER = root
INSTGROUP = root

OBJS = main.o

all: $(PROGS)
$(PROGS): $(OBJS)
   $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
   $(STRIP) $@

%.o: %.c
   $(CC) -c $(CFLAGS) $^ -o $@

install: $(PROGS)
   $(INSTALL) -d $(INSTDIR)
   $(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS) $(INSTDIR)

clean:
   rm -f $(PROGS) *.o core

Creamos un directorio, donde sea, llamado src y metemos ahí esos dos ficheros.

Creamos otro directorio llamado tp0set, y allí metemos el directorio src creado anteriormente. Ahora en el directorio tp0set creamos otro Makefile (el encargado de crear el paquete)

Citar
#
# Copyright (C) 2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=tp0set
PKG_RELEASE:=1
PKG_VERSION:=1.0

include $(INCLUDE_DIR)/package.mk

define Package/tp0set
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=Tool for switching main core
endef

define Package/tp0set/description
   Tool for switching main core, it writes some bytes to CFE
endef

define Build/Prepare
   mkdir -p $(PKG_BUILD_DIR)
   $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
   $(MAKE) -C $(PKG_BUILD_DIR) \
      $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
endef

define Package/tp0set/install
   $(INSTALL_DIR) $(1)/usr/bin
   $(INSTALL_BIN) $(PKG_BUILD_DIR)/tp0set $(1)/usr/bin/
endef

$(eval $(call BuildPackage,tp0set))

este es el makefile que crea el paquete.

Copiamos el directorio tp0set al directorio packages/ de openwrt, quedando algo tal que así:



hacemos make menuconfig y seleccionamos el paquete tp0set. Salimos guardamos
y compilamos el paquete

Código: [Seleccionar]
make package/tp0set/compile V=s
Como se ve los pasos son sencillos, lo complicado viene si queremos crear paquetes más complejos.

Por otra parte para verificar que la cosa compila correctamente en nuestro pc, antes de meternos a crear makefiles, puede bastarnos en este caso el comando:
Código: [Seleccionar]
gcc -o tp0set main.c
PD: Ni se os ocurra ejecutar este programa en vuestro router  >:D.
« Última modificación: 08-02-2015, 15:30 (Domingo) por danitool »